Подтвердить что ты не робот

Побитовое "&" на длинном?

Я хочу получить минимум 32 бита из числа длинного типа, поэтому я выполняю побитовую операцию "&" на число с битовой маской 0xFFFFFFFF, но результат неверен, он все еще содержит другие биты.

например:

long a = 0x1234567890ab; 
long b = (a & 0xffffffff);

Я ожидаю, что значение b будет 0x567890ab

но на практике все равно 0x1234567890ab

4b9b3361

Ответ 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-битного значения. прямо сейчас вы в основном ничего не делаете с номером.