Извлечение битов

for %1 in (*.*) do echo %1

Попытка "СПРАВКА ДЛЯ" в cmd для полного руководства

Это - руководство для команд XP. http://www.ss64.com/nt/

5
задан Kevin Reid 4 June 2013 в 14:34
поделиться

2 ответа

Используйте операторы битового сдвига для извлечения нужных битов.

pageNumber = x >> 10;
offset = x & ((1 << 10) - 1);

Для номера страницы оператор >> сдвигает биты вниз, поэтому вы теряете наименее значимые биты .

Для смещения ((1 << 10) - 1) создает битовую маску, состоящую из 10 единиц, которая используется для выбора только 10 младших битов и игнорирования самых старших битов.

11
ответ дан 18 December 2019 в 14:47
поделиться

Я большой поклонник "двухсменного" метода извлечения поля. Он работает как со знаком, так и без знака. Чтобы извлечь поле шириной w с младшим битом lsb из word :

#define BITSIN(W) (8*sizeof(W))
return (word << (BITSIN(word) - (lsb+width))) >> (BITSIN(word) - width);

В этом случае BITSIN (word) == 32 и lsb + width == 32 , поэтому, пока слово, о котором идет речь, не имеет знака, вы можете просто сдвинуть вправо на 10 без маскировки.

Одно предупреждение: остерегайтесь 32-битных переключает на 32-битные типы ! Стандарт C позволяет компилятору делать что угодно, и то, что делают обычные чипы Intel, бесполезно: x << y сдвигает x влево на y% 32 бит (при условии, что x имеет 32-битный целочисленный тип). Это означает, что если вы попытаетесь сдвинуть 32-битное целое число влево или вправо на 32 бита, результат такой же, как и при бездействии. Аналогичная проблема возникает с 64-битными сдвигами 64-битных типов.

2
ответ дан 18 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: