И с полными битами? - PullRequest
2 голосов
/ 30 июня 2009

В последнее время я перечитывал какой-то код и наткнулся на несколько строк, таких как:

somevar &= 0xFFFFFFFF;

Какой смысл в том, чтобы найти что-то, для чего все биты включены; разве это не равняется somevar в конце?

Ответы [ 6 ]

15 голосов
/ 30 июня 2009

«somevar» может быть 64-битной переменной, поэтому этот код будет извлекать нижние 32 бита.

edit: если это 32-битная переменная, я могу подумать о других причинах, но они гораздо более неясны:

  • константа 0xFFFFFFFF была автоматически сгенерирована, код
  • кто-то пытается обмануть компилятор, чтобы не допустить оптимизации чего-либо
  • кто-то преднамеренно хочет, чтобы запретившая линия могла устанавливать точку останова во время отладки.
5 голосов
/ 30 июня 2009

Действительно, это не имеет смысла, если somevar имеет тип int (32-разрядное целое число). Однако, если он имеет тип long (64-разрядное целое число), то это маскирует верхнюю (наиболее значимую) половину значения.

Обратите внимание, что значение long не обязательно равно 64 битам, но обычно равно на 32-битном компьютере.

3 голосов
/ 30 июня 2009

Полагаю, это зависит от длины сомвара. Это, конечно, не было бы запретом, если бы somevar был 64-битным int. Или это сомвар некоторого типа с перегруженным operator&=.

2 голосов
/ 30 июня 2009

Если фрагмент кода был C ++, то оператор &= мог бы быть переопределен, чтобы иметь эффект, не связанный, в частности, с побитовым AND. Конечно, это было бы противно, зло, грязно ...

2 голосов
/ 30 июня 2009

да, безусловно, для усечения 32 бит в 64-битной среде.

1 голос
/ 30 июня 2009

иногда размер long составляет 32 бита, иногда это 64 бита, иногда это что-то другое. Возможно, код пытается это компенсировать - и либо просто использовать значение (если оно 32-битное), либо замаскировать оставшееся значение и использовать только младшие 32 бита. Конечно, это не действительно имеет смысл, потому что если бы это было желательно, было бы проще просто использовать int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...