计算机中数据的表示方法
二进制计数的缺点:书写太长,容易出错,一般计算机的数据位数都是4的整数倍,所以,在计算机里通常采用16进制计数法。用数字可以表示各种信息,计算机里只有数值,当你在内存中看到一个数值时,这个数值可能代表各种意义,生活中的数值也可以代表其他意义,如1234可以代表密码,存款额,电报信息,根据上下线索,我们就能够知道这数值代表的意义。
原码、反码和补码
原码
将最高位作为符号位(以0代表正,1代表负),其余各位代表数值本身的绝对值(以二进制表示)。
为了简单起见,我们用1个字节来表示一个整数。
+7的原码为: 00000111
-7的原码为: 10000111
问题:
+0的原码为: 00000000
-0的原码为: 10000000
反码
一个数如果为正,则它的反码与原码相同;一个数如果为负,则符号位为1,其余各位是对原码取反。
为了简单起见,我们用1个字节来表示一个整数。
+7的反码为: 00000111
-7的反码为: 11111000
问题:
+0的反码为: 00000000
-0的反码为: 11111111
补码
利用溢出,我们可以将减法变成加法。
对于十进制数,如果从9得到结果5,可以用减法:
9-4=5
因为4+6=10,我们将6作为4的补数,将上式的减法改写为加法:
9+6=15
去掉高位1(也就是减去10),得到结果5。
对于16进制数,如果从C得到结果5,可以用减法:
C-7=5
因为7+9=16,我们将9作为7的补数,将上式的减法改写为加法:
C+9=15
去掉高位1(也就是减去16),得到结果5。
补码
在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为:
1 00000000
进位1被丢弃。
补码
已知一个负数的补码,将其转换为十进制数,步骤:
1、先对各位取反;
2、将其转换为十进制数;
3、加上负号,再减去1。
例如:
11111010,最高位为1,是负数,先对各位取反得00000101,转换为十进制数得5,加上负号得-5,再减1得-6。
位运算符
为了方便对二进制位进行操作,Java给我们提供了四个二进制位操作符:
& 按位与
| 按位或
^ 按位异或
~ 按位取反
按位与
一个房间里有两个开关控制房间的灯的明暗。当两个开关同时处于打开状态时,灯才能亮。
开关1 开关2 灯的状态
关 关 暗
开 关 暗
关 开 暗
开 开 亮
按位与
01101101
00110111
00100101
结论:按位与,只有壹(1)壹(1)为1。
按位或
一个房间里有两个开关控制房间的灯的明暗。当任何一个开关处于打开状态时,灯就能亮。
开关1 开关2 灯的状态
关 关 暗
开 关 亮
关 开 亮
开 开 亮
按位或
01101101
00110111
01111111
结论:按位或,只有零(0)零(0)为0。
按位异或
一个房间里有两个开关控制房间的灯的明暗。当两个开关处于不同状态时,灯就能亮。
开关1 开关2 灯的状态
关 关 暗
开 关 亮
关 开 亮
开 开 暗
按位异或
01101101
00110111
01011010
结论:按位异或,只有零(0)壹(1)或壹(1)零(0)为1。
按位取反
~ 01101101
10010010
结论:对二进制数按位取反,即0变成1,1变成0。
移位运算符
Java中有三个移位运算符
左移:<<
带符号右移:>>
无符号右移:>>>
数 x x<<2 x>>2 x>>>2
17 00010001 00 01000100 00000100 01 00000100 01
-17 11101111 11 10111100 11111011 11 00111011 11