java >>> 16_n |= n >>> 16;怎么解释这段java代码?

  • Post author:
  • Post category:java


展开全部

正好遇到一个问题,所有就看了看。

第一个:

以65举例子,因为简单n-=1;// n=1000000(二进制)

…//16、8无变化62616964757a686964616fe59b9ee7ad9431333363396432

n|=n>>>4;//n=n|(n>>>4)=1000000|0000100=1000100

n|=n>>>2;//n=n|(n>>>2)=1000100|0010001=1010101

…看出规律来了吧,右移多少位,就把最高位右边的第x位设置为1;

第二次,就把两个为1的右边xx位再设置为1;

第n次,就把上一步出现的1右边xxxx位置为1;//xxx随便写写,意会

这样执行完,原来是1000000,变成了1111111,最后加1,就变成2的整数次方数了。

第二个:

还是以65举例子n=65;//n=1000001

temp=-n;//temp=11111111111111111111111110111111(负数用补码表示,就是最高位为1代表负数,其他位取反,然后最低位+1,所以就成了这个样子;例子用的32位)

n&-n;//按位与,全是1的才取1,所以n&-n=1(二进制)。和原来的不一样,所以不是2的整数次方数。

文字解释一下如果是2的整数次方数,其除最高位(指第一个不为0的数)外,其他位必然是0。

这个数的反码是,除原来最高位所在的位,其他全是1,包括比原来最高位还高的位置。

在内存中,这个数的相反数是以补码的形式存储的,也就是反码+1(一堆进位),就变成了,原数最高位及更高位为1,低位全0。

按位与操作,原数低位全0,结果低位也是0;原数最高位为1,补码也是1,最高位为1;更高位原数为0,更高位为0。

最后按位与运算变成了最高位为1,其他位为0,包括符号位。

这不正和原数一样么?

例子中的65,原数中除了低位中含有为1的位,对应反码中这一位是0,所以+1操作不会使这一位发生进位,最终补码最高位位置只能是0,再与原数运算后,最高位丢失,就不可能等于原数了。

偷偷告诉你,这个算法其实是java集合中初始化设定大小的算法,形式不一样而已。



版权声明:本文为weixin_42126677原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。