按位“&”在一长串?

问题描述:

我想从long类型中获取至少32位,所以我对位掩码为0xFFFFFFFF的数字执行按位操作“&”,但结果不正确,它仍包含其他位。按位“&”在一长串?

例如:

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

我希望b的值是0x567890ab

但在实践中,它仍然是0x1234567890ab

+0

作为一个C程序设计师(25年以上),我曾经使用无符号变量,以避免符号扩展问题,但在这种情况下,我应该在我的输尿管末端加上L。我正在学习java,我可能会陷入一些其他陷阱:o) – 2011-02-16 15:21:42

+1

该死的好问题。我刚刚遇到了这个问题,答案令人颇感意外。 Java Puzzlers中缺少这个吗? :) – 2012-01-05 14:03:08

试试这个:

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

0xffffffffint的文字,用于执行ng &long它由sign extension提升为long,因此它变成0xffffffffffffffff。为避免符号扩展,您需要将其写为long0xffffffffL的文字。

尝试做一个按位与与与一些前导零而不是一个32位值的长值。现在你基本上没有对数字做任何事情。

使用0xffffffffL有什么区别吗?

我认为会发生什么是0xffffffff被上传到很长时间,并且因为int和long都被签名,它会尝试保持相同的符号。

那么,既然为0xffffffff是-1作为一个int,它被转换为-1作为一项长期的,或0xffffffffffffffff