java >>> 16_n |= n >>> 16;怎么解释这段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集合中初始化设定大小的算法,形式不一样而已。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值