连帅帅 发表于 2021-8-13 11:46:31

每日一题: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开头的(即为正数),则不需要在取反码,然后去补码,直接即可转化为十进制。

今天讲的可能比较难以理解,有点像你刚学面向对象的时候,有点饶,大家仔细理解一下,其实道理很简单的。

Max472 发表于 2021-8-13 12:03:25

{:9_227:}

连帅帅 发表于 2021-8-13 13:56:16

Max472 发表于 2021-8-13 12:03


感谢您的支持{:10_265:}

老迈 发表于 2021-8-13 14:03:46

6

sunyt 发表于 2021-8-13 14:31:24

hornwong 发表于 2021-8-14 11:32:53

感谢分享!

明月清风OvO 发表于 2021-8-14 12:03:50

6

不大不小甲鱼 发表于 2021-8-14 14:55:23

6666666

说与山鬼听os 发表于 2021-8-14 17:32:08

棒棒

burntlime 发表于 2021-8-15 09:04:31

学习

sunyt 发表于 2021-8-15 12:00:43

来辣

老迈 发表于 2021-8-15 12:43:27

{:10_302:}

龖釋 发表于 2021-8-15 14:57:10

{:10_257:}

wublab 发表于 2021-8-15 15:43:40

学到了

13395984430 发表于 2021-8-16 09:50:13

学到了

Rebecca2021 发表于 2021-8-18 10:02:26

哇哦
页: [1]
查看完整版本: 每日一题:day002