按位“&”在一长串?
问题描述:
我想从long类型中获取至少32位,所以我对位掩码为0xFFFFFFFF的数字执行按位操作“&”,但结果不正确,它仍包含其他位。按位“&”在一长串?
例如:
long a = 0x1234567890ab;
long b = (a & 0xffffffff);
我希望b的值是0x567890ab
但在实践中,它仍然是0x1234567890ab
答
试试这个:
long a = 0x1234567890ab;
long b = (a & 0xffffffffL);
0xffffffff
是int
的文字,用于执行ng &
与long
它由sign extension提升为long
,因此它变成0xffffffffffffffff
。为避免符号扩展,您需要将其写为long
:0xffffffffL
的文字。
答
尝试做一个按位与与与一些前导零而不是一个32位值的长值。现在你基本上没有对数字做任何事情。
答
使用0xffffffffL有什么区别吗?
我认为会发生什么是0xffffffff被上传到很长时间,并且因为int和long都被签名,它会尝试保持相同的符号。
那么,既然为0xffffffff是-1作为一个int,它被转换为-1作为一项长期的,或0xffffffffffffffff
作为一个C程序设计师(25年以上),我曾经使用无符号变量,以避免符号扩展问题,但在这种情况下,我应该在我的输尿管末端加上L。我正在学习java,我可能会陷入一些其他陷阱:o) – 2011-02-16 15:21:42
该死的好问题。我刚刚遇到了这个问题,答案令人颇感意外。 Java Puzzlers中缺少这个吗? :) – 2012-01-05 14:03:08