счастье рядом
Подскажите, пожалуйста, что делают команды "& 0xF" и "& 0x7"?
Например, "132690 & 0xF" выдает 2, а "32 & 0x7" выдает 0.
Зачем это делается?
Например, "132690 & 0xF" выдает 2, а "32 & 0x7" выдает 0.
Зачем это делается?
Результат операции & истинен тогда и только тогда, когда левый и правый операнд ... (чего?)
я знаю, что это побитовое "И", я не понимаю, зачем это делается? например, если число & 0x7, то мы, получается, учитываем только последние три циферки, даже если число длинное, а остальные отбрасываем?
учитываем только последние три циферки, даже если число длинное, а остальные отбрасываем?
А т.к AND с нулём - это всегда 0, то можно сказать что и отбрасываем
AND часто используется на практике в битовых масках. Ведь значащие биты для and (еденички) можно ставить не только в конце, но и в начале/середине, тем самым получая нужную часть из длинной последовательности битов.
Допустим есть длинный паттерн 01010100111100101011101010001001
Если хочу получить из него какую-то часть - составляю "маску", где на требуемых местах будут стоять еденички, остальное отбросится за ненадобностью
пара примеров из практики.
Ситуация первая: в одно число упаковано несколько "флагов":
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.
r1 = 0;
1: // метка 1
inc r1 // r1 = r1 + 1
andi r2,r1,0xFF // в r2 помещаются последние 8 бит
bne r2, 1 // прыжок на метку 1, если r2 не ноль
такой цикл прокрутится 256 раз.
Еще одна весьма популярная конструкция.
Называется выравнивание (адреса, например), часто используется.
Суть в том, что иногда имеет смысл выравнивать адреса по границе dword (чтобы адрес оканчивался на 0x0,0x4,0x8,0xc).
Если r1 - адрес (произвольный), то r1 & 0xFFFFFFFС - адрес без двух последних бит.