19:34

счастье рядом
Подскажите, пожалуйста, что делают команды "& 0xF" и "& 0x7"?
Например, "132690 & 0xF" выдает 2, а "32 & 0x7" выдает 0.
Зачем это делается?

Комментарии
23.12.2012 в 19:44

& - это битовая операция "И", которая выполняется для всех бит независимо.

Результат операции & истинен тогда и только тогда, когда левый и правый операнд ... (чего?)
23.12.2012 в 21:17

счастье рядом
.Седьмой, нет, может я немного не так сформулировала вопрос...
я знаю, что это побитовое "И", я не понимаю, зачем это делается? например, если число & 0x7, то мы, получается, учитываем только последние три циферки, даже если число длинное, а остальные отбрасываем?
23.12.2012 в 23:45

Лучик искренности, ну да. Если числу не достаёт знаков, то мы просто докинем нулей слева


учитываем только последние три циферки, даже если число длинное, а остальные отбрасываем?
А т.к AND с нулём - это всегда 0, то можно сказать что и отбрасываем
23.12.2012 в 23:49

счастье рядом
.Седьмой, ага, спасибо... только все равно не понимаю, какой смысл это делать и терять все предыдущие цифры..
23.12.2012 в 23:59

Лучик искренности,
AND часто используется на практике в битовых масках. Ведь значащие биты для and (еденички) можно ставить не только в конце, но и в начале/середине, тем самым получая нужную часть из длинной последовательности битов.
Допустим есть длинный паттерн 01010100111100101011101010001001
Если хочу получить из него какую-то часть - составляю "маску", где на требуемых местах будут стоять еденички, остальное отбросится за ненадобностью
24.12.2012 в 00:11

Лучик искренности
пара примеров из практики.

Ситуация первая: в одно число упаковано несколько "флагов":

www.weblearn.hs-bremen.de/risse/RST/docs/MIPS/M...
стр.79 Configuration Register

биты | смысл поля
15 Indicates the endian mode in which the processor is running
14:13 Architecture type implemented by the processor
12:10 Architecture revision level
9:7 MMU Type
2:0 Kseg0 coherency algorithm.
6:3 Must be written as zero; returns zero on read.

Конфигурационный регистр содержит кучу информации, например 15-ый бит регистра указывает на порядок байт, последние 3 бита - способ доступа к сегменту памяти и т.д.

Допустим, нам нужно занести в регистр нужную информацию.
пусть это будет Kseg0 coherency algorithm:

mtc0 r1,C0_Config // в r1 помещается значение конфигурационного регистра
andi r2,r1,0x7 // выполняется r2 = r1 & 0x7 -> в r2 только 2:0 биты, остальные нули - получили в r2 значение поля Kseg0 coherency algorithm

Пусть нужно получить Architecture type implemented by the processor. Тогда нужно вычислить ( r1 & 0x6000) >> 13; в регистре будут последние два бита содержать Architecture type.
24.12.2012 в 00:17

Ситуация вторая, счетчик

r1 = 0;

1: // метка 1
inc r1 // r1 = r1 + 1
andi r2,r1,0xFF // в r2 помещаются последние 8 бит
bne r2, 1 // прыжок на метку 1, если r2 не ноль

такой цикл прокрутится 256 раз.
24.12.2012 в 06:40

счастье рядом
Trotil, .Седьмой, спасибо, значительно прояснилось...
24.12.2012 в 12:59

Аккаунт для использования в публичных местах. Основной ник - Trotil.
Всегда пожалуйста.

Еще одна весьма популярная конструкция.
Называется выравнивание (адреса, например), часто используется.
Суть в том, что иногда имеет смысл выравнивать адреса по границе dword (чтобы адрес оканчивался на 0x0,0x4,0x8,0xc).
Если r1 - адрес (произвольный), то r1 & 0xFFFFFFFС - адрес без двух последних бит.