n |= n >>> 16;怎么解释这段java代码?
答案:5 悬赏:50 手机版
解决时间 2021-11-21 03:41
- 提问者网友:富士山上尢
- 2021-11-20 22:36
n |= n >>> 16;怎么解释这段java代码?
最佳答案
- 五星知识达人网友:动情书生
- 2021-11-20 23:39
正好遇到一个问题,所有就看了看。
第一个:以65举例子,因为简单
n-=1;// n=1000000(二进制)
...//16、8无变化
n|=n>>>4;//n=n|(n>>>4)=1000000|0000100=1000100
n|=n>>>2;//n=n|(n>>>2)=1000100|0010001=1010101
...
第二个:还是以65举例子
n=65;//n=1000001
temp=-n;//temp=11111111111111111111111110111111(负数用补码表示,就是最高位为1代表负数,其他位取反,然后最低位+1,所以就成了这个样子;例子用的32位)
n&-n;//按位与,全是1的才取1,所以n&-n=1(二进制)。和原来的不一样,所以不是2的整数次方数。文字解释一下
第一个:以65举例子,因为简单
n-=1;// n=1000000(二进制)
...//16、8无变化
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随便写写,意会
第二个:还是以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,再与原数运算后,最高位丢失,就不可能等于原数了。
全部回答
- 1楼网友:渊鱼
- 2021-11-21 04:25
晕死,是C++不?
- 2楼网友:污到你湿
- 2021-11-21 04:03
可以把前后文一起发上来吗
- 3楼网友:拾荒鲤
- 2021-11-21 02:55
对不起,我小学生,根本看不懂,啥啥玩意
- 4楼网友:西风乍起
- 2021-11-21 01:17
这个是找到下一个最小的比入参大的2的高次幂。| 这个是按位或,>>>这个是无符号右移。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯