我想从多个long类型中获取至少32位,所以我执行按位操作“&”在位数为0xFFFFFFFF的数字上,但结果不正确,它仍然包含其他位。
例如:
long a = 0x1234567890ab;
long b = (a & 0xffffffff);
我希望b的值为0x567890ab
但实际上,它仍然是0x1234567890ab
答案 0 :(得分:45)
试试这个:
long a = 0x1234567890ab;
long b = (a & 0xffffffffL);
0xffffffff
是int
类型的文字,用&
执行long
,sign extension将其提升为long
类型,因此它变成0xffffffffffffffff
。要避免签名扩展,您需要将其写为long
类型的文字:0xffffffffL
。
答案 1 :(得分:3)
使用0xffffffffL会有什么不同吗?
我认为会发生的事情是0xffffffff上升到很长时间,并且因为int和long都被签名,所以它会尝试保持相同的符号。
所以,因为0xffffffff是-1作为int,它被转换为-1作为long,或者0xffffffffffffffff
答案 2 :(得分:0)
尝试使用带有一些前导零而不是32位值的长值进行按位AND。现在你基本上对这个数字一无所知。