java中“&,| ,~,^”中操作详解

271 阅读3分钟

1. 机器数、真值

机器数: 一个数值在计算机中的二进制数表示形式,称为该数的机器数,也叫做机器码。其中机器数中最高位用来表示该数值的正、负,正数为0,负数为1。
真值: 由于机器数中最高位为符号位,故机器数表示的数值并不等于真正的数值,而是通过除去符号位后表示的数值称为真值。

2. 原码、反码、补码

计算机使用机器数的形式存储数值,对于机器数的编码方式分为三种,分别为:原码、反码、补码:

原码: 最高位表示符号,其他位表示真值
反码: 正数的反码与原码相同,负数的反码为其原码除符号位外其他位置全部取反;
补码: 正数的补码与原码相同,负数的补码为其反码末位+1。


3.为什么数值在计算机中使用数值的补码进行存储与运算操作

使用补码有两点好处:

1. 省去计算机判断符号位的操作,采用补码运算后,加减法操作都可以使用加法操作代替。

2. 尽量保证了系统编码的连续性和一致性,同时避免了+/- 0的窘境

假设使用8位的 1 + (-1) 操作 使用原码运算为
1: 0000 0001
-1: 1000 0001
结果: 1000 0010-2
答案错误,因为正负数加减操作需除去符号位,由真值部分进行运算后加上符号位得出结果,如果用原码计算,让符号位直接参与运算,对于减法来说是不可行的。


使用反码运算为
+1: 0000 0001
-1: 1111 1110
反码结果: 1111 1111
原码结果: 1000 0000-0
答案真值部分虽然正确,但是却出现了-0的形式,0带符号是没有意义的,且表示0的编码存在两个:0000 00001000 0000


使用补码运算
+1: 0000 0001
-1: 1111 1111
补码结果: 10000 0000
原码结果: 0000 00000
答案正确,由于数值采用8位存储,首位被舍弃。 并且,使用补码能够多表示一个最低数。


5. java中存在位运算符&|~^操作:

  • & 与操作:将操作数进行与操作,相同位上都为1则为1,否之取0;
byte a = 1,b=2;
byte c = 1 & 2;
则 a: 0000 0001
   b: 0000 0010
      ——————————
   c:  0000 0000
故c = 0
  • | 或操作:将操作数进行或操作,相同位上凡有1则为1,否之取0;
byte a = 1,b=2;
byte c = 1 & 2;
则 a: 0000 0001
   b: 0000 0010
      ——————————
   c:  0000 0011
故c = 3
  • ~ 取反操作:将操作数进行取反操作,相同位上进行取反;
byte a = 1;
byte c = ~a;
则 a: 0000 0001
   ~: 1111 1110(补码)
    : 1111 1101(反码)
  c: 1000 0010(原码)
故c = -2
  • ^ 亦或操作:将操作数进行或操作,相同位上相同为0,反之取1;
byte a = 1,b=2;
byte c = 1 & 2;
则 a: 0000 0001
   b: 0000 0010
      ——————————
   c:  0000 0011
故c = 3