面试_java_二进制数操作相关

194 阅读4分钟

原码、反码、补码

原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。

比如9,其二进制原码就是1001。根据当前编程语言int所占的字节位数,在前面补零。比如在java中int占4位,所以原码为 00000000 00000000 00000000 00001001


反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。

比如9,原码为 00000000 00000000 00000000 00001001 ,所以反码为 11111111 11111111 11111111 11110110


补码:反码加1称为补码

比如9,反码为 11111111 11111111 11111111 11110110 ,所以补码为 11111111 11111111 11111111 11110111





正数与负数的二进制表示

  • 正数:按照正值的原码表示

    9 的原码是 00000000 00000000 00000000 00001001

  • 负数:按照其正值的补码形式表示

    -9 的原码是 00000000 00000000 00000000 00001001

    -9 的反码为 11111111 11111111 11111111 11110110

    -9 的补码是 11111111 11111111 11111111 11110111





无符号数和有符号数

  • 无符号数:最高位的1或0,和其它位一样,用来表示该数的大小。
  • 有符号数:最高数称为“符号位”。为1时表示负值,为0时表示正值。

比如无符号数表示的范围是[0, 255] ; 那么有符号数表示的范围就是[-128, 127)


注意:

  • 无符号数可以是正数,也可以是负数

  • 同样,有符号数可以是正数,也可以是负数

关键是自己决定最高位拿不拿来当符号位,如果用,就是有符号数;反之就是无符号数。与正负数无关。





无符号左移与右移、有符号左移与右移

以下统一

如果移动的位数超过当前变量所能表示的最大位数,计算机会自动对移动的位数取模。

比如java中int能存储32位,如果要求移动32位,相当于不移动,因为32%32=0;如果要求移动35位,相当于移动3位,因为35%32=3 。


1. 无符号数右移

直接右移,右边移出的部分删除,左边空出的部分补零

比如 9 。原来是 00000000 00000000 00000000 00001001 ,右移2位后为 00000000 00000000 00000000 00000010

比如 -9 。原来是11111111 11111111 11111111 11110111 ,右移2位后为00111111 11111111 11111111 11111101

java中无符号数右移的方法:10进制数>>>右移的位数



2. 有符号数右移

右移后,右边移出的部分删除,左边空出的部分都用符号位补充

比如 9 。原来是 00000000 00000000 00000000 00001001 ,右移2位后为 00000000 00000000 00000000 00000010 。因为符号位为0,所以补两个0

比如 -9 。原来是11111111 11111111 11111111 11110111 ,右移2位后为11111111 11111111 11111111 11111101 。因为符号位为1,所以补两个1

java中无符号数右移的方法:10进制数>>右移的位数



3. 左移

左移不区分有符号和无符号,方法一样。

左移后,左边移出的部分删除,右边空出的部分都用0补充


java中左移的方法:10进制数<<左移的位数