<font size = 4>首先强调一下 <font color=red>二进制数在内存中以补码的形式存在</font>(可能我自己的知识点匮乏)</font>
二进制就不简单说了,先介绍一下原码、反码、补码的知识点
<font color = gray size =3>
对于有符号数而言
- 二进制的最高位是符号为:0为正,1为负
- <font color = red>正数的原码、反码、补码都是一样的。</font>
- 负数的反码 = 原码符号位不变,其他位取反(0变1,1变0)
- 负数的补码 = 反码 + 1;
- <font color = red>负数的原码 = 反码取反</font>
- <font color = red>负数的原码 = 补码取反 + 1</font>
- 0的反码、补码都为0
- <font color = red>在计算机运行的时候,都是以补码的方式来运行的</font>
</font>
// 由于计算机数字是32位,这里举例暂用8位
下面来介绍一下位取反 (~)
// 我们对 11进行取反 (~11)
// 11 在计算机中储存是它的补码(正数原码、补码都一样)
// 0000 1011 (11的原码)
// 0000 1011 (11的补码)
// 1111 0100 (按位取反) (这里得到的是内存中储存的二进制,即 原数的补码)
// 接下来将补码转变成原码(符号位不变,减一取反)
// 1000 1100 ( == -12)
有个小规律:<font color = greed>位运算符(~)—— 数字求负数,然后减一 (-number -1
)</font>
位运算符 与 (&)
/*
每一位与的规律:
0 0 0
0 1 0
1 0 0
1 1 1
*/
// 来试试 25 & 3
// 0001 1001 // 25的补码 由于正数,原、补、反码都一样
// 0000 0011 // 3的补码
// 0000 0001 // 25 & 3 = 1
// 看看负数 -25 & -3
// 1001 1001 // -25的原码
// 1000 0011 // -3的原码
// 1110 0111 // -25的补码
// 1111 1101 // -3的补码
// 1110 0101 // -25 & -3的补码
// 1001 1011 // -25 & -3的原码 = -27
位运算符 或 (|)
/*
每一位与的规律:
0 0 0
0 1 1
1 0 1
1 1 1
*/
// 来试试 25 | 3
// 0001 1001 // 25的补码 由于正数,原、补、反码都一样
// 0000 0011 // 3的补码
// 0001 1011 // 25 | 3 = 27
// 看看负数 -25 | -3
// 1001 1001 // -25的原码
// 1000 0011 // -3的原码
// 1110 0111 // -25的补码
// 1111 1101 // -3的补码
// 1111 1111 // -25 | -3的补码
// 1000 0001 // -25 | -3的原码 = -1
位运算符 异或 (^)
/*
每一位与的规律:
0 0 0
0 1 1
1 0 1
1 1 0
*/
// 来试试 25 ^ 3
// 0001 1001 // 25的补码 由于正数,原、补、反码都一样
// 0000 0011 // 3的补码
// 0001 1010 // 25 ^ 3 = 26
// 看看负数 -25 ^ -3
// 1001 1001 // -25的原码
// 1000 0011 // -3的原码
// 1110 0111 // -25的补码
// 1111 1101 // -3的补码
// 0001 1010 // -25 ^ -3的补码 (正数 也是 -25 ^ 3 的原码)
位运算符 左移 (<<)
// 整体向往左移动,用<font color = red>0</font>补齐,符号位不变
// 来试试 25 << 2
// 0001 1001 // 25
// 0110 0100 // 25 << 2 == 100
// 来试试 -25 << 2
// 1001 1001 // -25
// 1110 0100 // -25 << 2 == -100
位运算符 右移 (>>)
// 整体向往右移动,用 <font color = red>符号位</font> 补齐,符号位不变
// 来试试 25 >> 2
// 0001 1001 // 25
// 0000 0110 // 25 >> 2 == 6 //符号位为0 补齐
// 来试试 -25 >> 2
// 1001 1001 // -25
// 1110 0111 // -25的补码
// 1111 1001 // -25 >> 2的补码
// 1000 0111 //-25 >> 2 的原码 == -7
网友评论