2009-11-23 5 views
0

Продолжая мой предыдущий вопрос Why I cannot derive from long?Длинного типа, сдвиг влево и вправо операции переключения

я нашел интересную проблему.

Шаг один:

4294967296 & 0xFFFFFFFF00000000 

Результат: 4294967296.

Шаг два.

4294967296 & 0x00000000FFFFFFFF 

Результат: 0

Ага, так вот я полагаю, что 4294967296 == 0xFFFFFFFF

Давайте проверим

(long)0x00000000FFFFFFFF 

Результат: 4294967295. фаил.

двойная проверка Давайте

4294967296 >> 32 

Результат: 1. Неудача.

Единственное объяснение состоит в том, что, поскольку я использую long, где , бит зарезервирован для знака. В C я буду использовать unsigned long. Как вы думаете, ребята?

+1

Число, которое выглядит как ... 6 в десятичной системе, не может равняться числу, которое выглядит. ..F в гексагоне. Один четный, и один странный! – AakashM

ответ

5
4294967296 & 0xFFFFFFFF00000000 = 4294967296 

Это означает, что значение 4294967296 не имеет битов, установленных в младших 32-битах. Фактически, 4294967296 - 0x100000000, так что это правда.

4294967296 >> 32 = 1 

Снова, согласовано.

Другими словами, ваш вывод о том, что 4294967296 равен 0xFFFFFFFF, неверен, поэтому оставшиеся проверки не поддержат это.

+0

Позор мне. Благодарю.Но я пришел к такому выводу отладки следующего кода, который не работает long a = 2; long b = 3; длинный упакованный = a + b << 32; // теперь давайте распакуем long a1 = упакованный & 0xFFFFFFFF; длинный b1 = упакованный >> 32; Результат: a1 = 0; b1 = 5; Где ошибка? Должна быть какая-то действительно простая ошибка. –

+0

Извините, что форматирование не работает в комментариях –

+2

Ваша проблема связана с оператором. Плюс обрабатывается до смещения бит. Попробуйте «longaged = a + (b << 32)»; – fyjham

1

Я думаю, что вы не понимаете поразрядную операцию and. Побитовый and вернет биты, которые установлены в обоих. Если два были одинаковы, то

(4294967296 & 0xFFFFFFFF00000000) == 4294967296 

и

(4294967296 & 0xFFFFFFFF00000000) == 0xFFFFFFFF00000000 

бы как держать, но они явно не делают.

3

Ум ... Я не уверен, почему вы пришли к выводам, которые вы сделали, но 4294967296 - 0x100000000. Выписать побитовое И в легко читаемом гексе ...

0x0000000100000000 & 
0x00000000FFFFFFFF = 
0x0000000000000000 

0x0000000100000000 & 
0xFFFFFFFF00000000 = 
0x0000000100000000 

Оба эти понятия имеют прекрасный смысл. Возможно, вы неправильно понимаете побитовое ... ... оно отображает биты, которые одинаковы для обоих. Ваши комментарии кажутся более уместными для побитового XOR, чем побитовое И (что не является той операцией, которую вы используете) ...

Смежные вопросы