二进制知识补充

计算机对有符号数(包括浮点数)的表示有三种方法:原码、反码和补码,补码=反码+1。在二进制里,是用0和1来表示正负的,最高位为符号位(所以一个完整的二进制数33位),最高位为1代表负数,最高位为0代表正数。

负数取二进制的方式

以-5为例:

  1. 取负数的绝对值的二进制;(5的二进制 0[符号位]0000000000000000000000000000101)
  2. 取1中二进制的反码;(取反:11111111111111111111111111111010,其实就是~5=-6)
  3. 取2中的反码+1;(反码+1:11111111111111111111111111111011,即最终结果)

    机器数

    可以理解为给我们人看的二进制,注意计算机中保存数据用的二进制,根本不是这个机器数,而是补码 ; 比如,数字 3 ,在 java 中整数,默认是 int 类型,占用4个字节,所以,它的机器数是 0000 0000 0000 0000 0000 0000 0000 0011 ; 数字 -3 的机器数: 1000 0000 0000 0000 0000 0000 0000 0011 ; 在二进制中,最高位是符号位,0 代表正数,1 代表负数,其中符号位是不参与进位的 ;

真值

就是除去符号位,剩下的位的二进制转成十进制,再配上正负号的值。我们要看一串 0101001010,是看它真值的,而不是看他二进制直接转成十进制是多少。 比如, 1000 0000 0000 0000 0000 0000 0000 0011 的真值是 -3 ,二进制直接转成十进制却是 2147483651 。

原码

和真值是一个意思

反码

正数的原码和反码是一样的。负数的反码是由原码保存符号位不变,其他位取反得到的。 例如: 数字 3 原码是 0000 0000 0000 0000 0000 0000 0000 0011 ; 反码是 0000 0000 0000 0000 0000 0000 0000 0011 ;

数字 -3 原码是 1000 0000 0000 0000 0000 0000 0000 0011 ; 反码是 1111 1111 1111 1111 1111 1111 1111 1100 ;

补码

正数的原码和补码是一样的。负数的补码是由反码 +1,得到的,并且这个加法操作产生的进位,不能进位到符号位。 例如: 数字 3 原码是 0000 0000 0000 0000 0000 0000 0000 0011 ; 反码是 0000 0000 0000 0000 0000 0000 0000 0011 ; 补码是 0000 0000 0000 0000 0000 0000 0000 0011 ;

数字 -3 原码是 1000 0000 0000 0000 0000 0000 0000 0011 ; 反码是 1111 1111 1111 1111 1111 1111 1111 1100 ;

补码是 1111 1111 1111 1111 1111 1111 1111 1101 ;

字节数知识补充

一个字节等于8位;1 byte = 8 bit

位运算 - 图1

左移 <<(“<<”左侧的数字左移,在低位补0)

a << b 表示 a × 2 例如 7 << 3 = 7 × 2 = 56

  1. @Test
  2. public void test() {
  3. int a = 7;
  4. System.out.println(a >> 3); //56
  5. }

右移 >> (有符号位右移(符号不动),如果正数,高位补0;负数,高位补1)

a >> b 表示 a ÷ 2 例如 100 >> 2 = 100 ÷ 2 = 25

  1. @Test
  2. public void test() {
  3. int a = 100;
  4. System.out.println(a >> 2); //25
  5. }

右移 >>> (无符号位右移(符号跟着动),无关正负,都在高位补0)

区分正负 a 是一个正数 :a >>> b 等同于 a >> b a 是一个负数 :a >>> b a带着符号右移b位

亦或运算 ^ ,相同的为0,不同的为1

2:0010 3:0011 结果:0001 => 1

与运算 & , 只要有一个为0,就为0

2:0010

3:0011

结果:0010 => 2 可以用来判断奇偶:X & 1 == 1 ,则X为奇数;**X & 1 == 0 则X为偶数。**

或运算 | , 只要有一个为1,就为1

2:0010 3:0011 结果:0011 => 3

常用的位运算

任意正整数包括0 >> 31 结果为 0
任意负整数 >> 31 结果为 -1
任意正整数包括0 >>> 31 结果为 0
任意负整数 >>> 31 结果为 1
>>> 处理结果为 正数
>> 原数值正负状态不变
N >> 1 当N为正整数或0时,表示对2整除;如:(2>>1=1)
N >> 1 当N为负数时,表示对2整除,保留负数符号;如:(-2>>1=-1)
N >>> 1 当N为正整数时,也表示对2整除;如:(2>>>1=1)
N >>> 1 当N为负数时,则进行 无符号右移
位与运算符(&) 运算规则:两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否则为0。
位或运算符(|)运算规则:两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0。



执行结果如下:

true &= true ==> true
true &= false ==> false
false &= true ==> false
false &= false ==> false

true |= true ==> true
true |= false ==> true
false |= true ==> true
false |= false ==> false

^= 相同为真,不同为假
true ^= true ==> false
true ^= false ==> true
false ^= true ==> true
false ^= false ==> false