Извлечение бит - PullRequest
       18

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

5 голосов
/ 30 ноября 2009

В С, У меня есть 32-разрядное слово, представляющее адрес (и я храню его в длинном без знака, надеюсь, это нормально). Теперь из того, что я собираю, часть адреса содержит номер страницы, а другая часть содержит смещение. Мне было интересно, как я могу извлечь только те биты, которые дают мне номер страницы. Я уже определил, что первые 22 старших бита - это номер страницы, а остальные 10 бит - это смещение страницы. Как я могу получить только те биты, которые являются номером страницы? Я думаю, что могу сделать это с помощью некоторых побитовых операций, но я не уверен, как.

Ответы [ 2 ]

11 голосов
/ 30 ноября 2009

Используйте операторы битовое смещение , чтобы извлечь нужные биты.

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

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

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

2 голосов
/ 30 ноября 2009

Я большой поклонник метода «двухсменной» добычи. Работает как подписанный, так и неподписанный. Чтобы извлечь поле ширины 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-битных типов.

...