Побитовое "&" на длинном?
Я хочу получить минимум 32 бита из числа длинного типа, поэтому я выполняю побитовую операцию "&" на число с битовой маской 0xFFFFFFFF, но результат неверен, он все еще содержит другие биты.
например:
long a = 0x1234567890ab;
long b = (a & 0xffffffff);
Я ожидаю, что значение b будет 0x567890ab
но на практике все равно 0x1234567890ab
Ответы
Ответ 1
Попробуйте следующее:
long a = 0x1234567890ab;
long b = (a & 0xffffffffL);
0xffffffff
является литералом типа int
, для выполнения &
с long
он продвигается, чтобы ввести long
в расширение знака, поэтому он превращается в 0xffffffffffffffff
. Чтобы избежать расширения знака, вам нужно записать его как литерал типа long
: 0xffffffffL
.
Ответ 2
Использует ли использование 0xffffffffL какую-либо разницу?
Я думаю, что происходит то, что 0xffffffff получает upcasted до длинного, и поскольку как int, так и long подписаны, он пытается сохранить один и тот же знак.
Итак, поскольку 0xffffffff равно -1 как int, он преобразуется в -1 как long или 0xffffffffffffffff
Ответ 3
попробуйте выполнить побитовое И с длинным значением с некоторыми ведущими нулями вместо 32-битного значения. прямо сейчас вы в основном ничего не делаете с номером.