位 相关
2020-04-23 本文已影响0人
一个追寻者的故事
基本概念
我们都知道,整数在计算机中是以 二进制 表示的。
以Java
中的 有符号的 int 四字节(8位字节)为例:
二进制 | 十进制 |
---|---|
01111111 11111111 11111111 11111111 | 2147483647(Integer.MAX_VALUE) |
............ | ..... |
00000000 00000000 00000000 00000101 | 5 |
00000000 00000000 00000000 00000100 | 4 |
00000000 00000000 00000000 00000011 | 3 |
00000000 00000000 00000000 00000010 | 2 |
00000000 00000000 00000000 00000001 | 1 |
00000000 00000000 00000000 00000000 | 0 |
11111111 11111111 11111111 11111111 | -1 |
11111111 11111111 11111111 11111110 | -2 |
11111111 11111111 11111111 11111101 | -3 |
11111111 11111111 11111111 11111100 | -4 |
11111111 11111111 11111111 11111011 | -5 |
....... | ...... |
1000000 0000000 0000000 0000000 | -2147483648(Integer.MIN_VALUE) |
原码、反码、补码
计算机中,正整数用原码存储,负整数用 正整数的 补码存储。
(这一套规则,既实现简单又运行高效。当然也可以定义其它规则,就看能不能更高效、实现更简单)
以十进制中的 1
为例:
原码
: 00000000 00000000 00000000 00000001
反码
: 11111111 11111111 11111111 11111110
补码
: 11111111 11111111 11111111 11111111
反码 为 原码按位取反,补码 = 反码 + 1
其实不管怎么样存储 正整数、负整数,最终都要满足 A + (-A) = 0
任何一个 正整数 的原码 + 反码 的结果都是 11111111 11111111 11111111 11111111。 所以再 + 1,结果就都为 00000000 00000000 00000000 00000000 。 所以 负整数 用补码表示 正好满足:A + (-A) = 0
其它
1、问:为什么 int 能表示的 正整数 比 负整数 少一个呢?
答:因为 0
占用了 正整数 所能表达的一个份额
2、在Java 中可以给 int 用 10进制
赋值,也可以用 16进制
赋值,当然也可以直接用位运算的结果
赋值。
/**
使用十进制赋值时,会在运行时自动转成 二进制(整数用原码、复数用补码) 去运算和计算。
**/
int a = 5;
int b = -6;
/**
如果使用以下方式赋值。会看最高位,如果是0,会认为是 正整数的原码形式;如果是 1,会认为是 负整数 的补码形式
**/
int c = 0x7fffffff;
int d = 1 << 30;
3、关于位运算的一个有意思的
位运算 | 二进制结果 | 十进制结果 |
---|---|---|
1 << 30 | 01000000 00000000 00000000 00000000 | 1073741824 |
1 << 31 | 10000000 00000000 00000000 00000000 | Integer.MIN_VALUE |
1 << 31 | 00000000 00000000 00000000 00000001 | 1 |
1 << 32 | 00000000 00000000 00000000 00000010 | 2 |
1 << 33 | 00000000 00000000 00000000 00000100 | 4 |