每日一题:day002
本帖最后由 连帅帅 于 2021-8-13 11:47 编辑题目:计算机中无符号右移和带符号右移的介绍,请看下面的代码,最后输出逇y是什么?
public static void main(String args[]) {
int x, y;
x = 5 >> 2;
y = x >>> 2;
System.out.println(y);
}
解题思路:本体主要涉及到右移>>与无符号右移>>>的使用,另外对计算机正负数的原码,反码,补码要理解会用。
先来聊聊计算机的几个码:
机器数:带有0、1的二进制数,但0、1不参与进制转换,比如x=001,就是机器数,其真值为+1,再比如x=101,也机器数,其真值为-1;
真值:-1011.1101,原码:1111.1101
原码:8位二进制来说,因为第一个为正(0)负(1)号,所以,其取值范围为111111111~011111111即-127~127;符号位与数值位之间用英文逗号,隔开,小数点用英文句号.隔开;
反码:正数的反码为其本身,负数的反码符号位不变,数值位取反;
补码:正数的补码为其本身,负数的补码在其反码的基础上加1;
移码:补码的符号位取反,数值位不变;
再来聊聊什么是>>以及>>>:
>>:右移,将数计算出的补码右移相应的位数;比如:二进制补码:1001,右移两位为:0010;另外负数的右移高位是补1,正数是补0的;
>>>:无符号右移,和右移几乎一致,不一致的地方在于无符号右移正负数的高位都是补0;
题解:
5的二进制为:
原码:0000 0000 0000 0000 0000 0000 0000 0101
反码:0000 0000 0000 0000 0000 0000 0000 0101
补码:0000 0000 0000 0000 0000 0000 0000 0101
右移两位为:0000 0000 0000 0000 0000 0000 0001
转化为十进制数为:1*2^0值为1;
然后就是1>>> 2
同样的,1的二进制为:
原码:0000 0000 0000 0000 0000 0000 0000 0001
反码:0000 0000 0000 0000 0000 0000 0000 0001
补码:0000 0000 0000 0000 0000 0000 0000 0001
右移两位:0000 0000 0000 0000 0000 0000 0000 0000
转化为十进制数为:0
注意:如果计算出的补码右移结束后是1开头的(即为负数),则需要在取其反码,在取补码,然后转换为十进制数,如果是0开头的(即为正数),则不需要在取反码,然后去补码,直接即可转化为十进制。
今天讲的可能比较难以理解,有点像你刚学面向对象的时候,有点饶,大家仔细理解一下,其实道理很简单的。 {:9_227:} Max472 发表于 2021-8-13 12:03
感谢您的支持{:10_265:} 6 眼 感谢分享! 6 6666666 棒棒 学习 来辣 {:10_302:} {:10_257:} 学到了 学到了 哇哦
页:
[1]