原码,反码,补码 以及 位运算

1. 原码,反码,补码 的总结 (熟背)

  1. 二进制的最高位是符号位:0表示正数,1表示负数
  2. 正数的原码,反码,补码都一样
  3. 负数的反码 = 原码的符号位不变 其它位取反 (0 > 1, 1 > 0)
  4. 负数的补码 = 反码 + 1,负数的反码 = 补码 -1
  5. 0的反码,补码都是0
  6. 没有无符号的数
  7. 在计算机运算的时候,都是以 补码的方式来运算
  8. 当我们看运算结果的时候,要看它的 原码

2. 原码

  • 十进制数据的二进制表现形式就是原码,原码最左边的一个数字就是符号位,0为正,1为负
  • 左边第一位为符号位,其他位为数据位。
  • 一个 byte 有 8bit,最大值是 0 1 1 1 1 1 1 1 (+127),最小值是 1 1 1 1 1 1 1 1 (-127)
// 5 的二进制 
var num1 = 5
num1.toString(2)
//  00000101
// 那么-5的二进制就是 10000101

3. 反码

  • 正数的原码,反码,补码都一样
  • 负数的反码 = 原码的符号位不变 其它位取反 (0 > 1, 1 > 0)
  • 负数的反码 = 补码 -1
// 	计算 -5的反码
	5的原码 00000101
	-5的原码 就是 10000101
	符号位不变其他位取反
	那么-5的反码 就是 11111010

4. 补码

  • 正数的原码,反码,补码都一样
  • 负数的补码 = 反码 + 1
// 还是以-5举例
	上面-5的反码是 11111010 那它的补码加1就是
	11111010 (-5的反码)
+	00000001 (加1)
------------------
	11111011 (补码)

5. 加减运算(补码的方式来运算)

  • 在计算机运算的时候,都是以 补码的方式来运算
  1. 解释一下 3 + 5 二进制运算过程

    将 3 和 5 转换为二进制数:
    3 的二进制补码表示为 00000011。
    5 的二进制补码表示为 00000101。
    执行二进制加法,考虑进位:

   00000011   (3 的二进制补码)
+  00000101   (5 的二进制补码)
-----------
   00001000 

结果为 00001000 。

将结果转换回十进制,根据最高位的符号位决定正负:

结果为正数,因为最高位为 0,表示正数。
去除符号位 0,剩下的位数为 00001000,转换为十进制为 8。
因此,3 + 5 的结果是 2。

  1. 解释一下 -3 + 5 二进制运算过程

    将 -3 和 5 转换为二进制数:
    -3 的二进制原码:10000011 反码:11111100 补码: 11111101。
    5 的二进制表示为 00000101。
    执行二进制加法,考虑进位:

  11111101   (-3 的二进制补码)
+ 00000101   (5 的二进制)
-----------
1 00000010   (结果的二进制补码,其中最高位表示进位,超出位舍去)

结果为 00000010,其中最高位的 1 表示进位。

将结果转换回十进制,根据最高位的符号位决定正负:

结果为正数,因为最高位为 0,表示正数。
去除符号位 0,剩下的位数为 00000010,转换为十进制为 2。
因此,-3 + 5 的结果是 2。

  1. 解释一下 -5 + 3 二进制运算过程

    将 -5 和 3 转换为二进制数:
    -5 的二进制原码:10000101 反码:11111010 补码:11111011
    3 的二进制表示为 00000011。
    执行二进制加法,考虑进位:

  11111011   (-5 的二进制补码)
+ 00000011   (3 的二进制)
-----------
  11111110   (结果的二进制补码,最后结果要原码展示)

因为最高位为 1,表示负数。
负数的反码 = 补码 -1

  11111110   
- 00000001   
-----------
  11111101 

它的反码就是 11111101 取反的原码就是 10000010
因此,-5 + 3 的结果是 -2。

6. 位运算

1.按位与&
按位与运算符(&)是将两个数的二进制位对应位置相与,如果都是1,则结果为1,否则为0。例如,3 & 5的结果为1。

  00000011  (3的二进制)
  00000101  (5的二进制)
-----------
  00000001  (所以结果就是1,下面的运算同理)

2.按位或 |
将两个数的二进制位对应位置相或,如果有一个是1,则结果为1,否则为0。

3.按位异或 ^
将两个数的二进制位对应位置不一样就是1,一样就是0。

4.按位取反 ~
按位取反运算符是将一个数的二进制表示中的0变为1(符号位也会取反),1变为0。例如,~3的结果为-4。

5.左移 <<
符号位不变,右侧补0。

6.右移 >>
符号位不变,并用符号位补高位

7.无符号右移 >>>
无符号右移运算符(>>>)是将一个数的二进制表示向右移动指定的位数,符号位要跟着右移,左侧补0。

你可能感兴趣的:(学习,计算机基础,java,javascript)