一、计算机中的数据
1.计算机中的数据表示方法:
1.计算机是一种电子设备,由于复杂的元器件组成合而成,一个电子元器件有带电和不带电两种状态,通常我们将带电状态表示为1,不带电状态表为0,多个元器件组合,可以表示更多的状态,也就是可以表示更多的数据,如000表示0,001表示1,010表示2,011表示3,依次类推,111表示7,一个元器件可以表示一位(bit)数据,这种表示数据的方法就叫二进制。2.在实际的电子设备中,我们将8个这样的元器件形成一个单元,这样的一个单元叫字节(byte),一个字节,可以表示数值的范围是0~255。
3.一个字节由8个bit组成,其中最右边的一位称为:“最低有效位”或“最低位”,最左边的一位为称为:“最高有效位”或“最高位”,每个二进制是0或1。
2.原码、反码和补码
原码:将最高位做为符号位,(0代表正,1代表负),其余的代表数值本身的绝对值(以二进制表示)。为了简单起见,我们用1个字节代表一个整数。
+7的原码: 00000111
-7的原码: 10000111
问题:
+0的源码: 00000000
-0的源码: 10000000
总结:由于正0和负0都是0,但是在计算机中表示不唯一,所以在计算机中没有采用原码这种表示信息。
3.反码:一个数如果为正,则它的反码与原码相同:一个数如果为负,则符号为1,其余位是对反码原码取反。
为了简单起见,我们用1个字节代表一个整数。+7的反码: 00000111
-7的反码: 11111000
问题:
+0的的反码: 00000000
-0的的反码: 11111111
总结:取反的意思就是将0变为1,将1变0。
由于0的反码值依然是不唯一的,所以在计算机中没有采用反码这种表示信息。
4.补码(1):利用溢出,我们可以将减法变成加法。
对于十进制数,如果从9得到结果5,可以用减法。9-4=5
因为6+4=10,我们将6作为4的补数,将上式的减法改写为加法。
9+6=15
去掉高位1(也就是减10),得以的结果5。
对于十六进制,如果从C得到的结果5,可以用减法:
C-7=5
因为7+9=16,我们将9作为7补数,将上式中的减法做为加法:
C+9=15
去掉高位1(也就是减去16),得到结果5。
总结:在计算机中,如果我们用1字节表示一个数,一个字节有8位,超过8位就进1,在内存的情况10000000,进位1被丢弃。
5.补码(2):一个数如果为正,则它的原码、反码、补码相同,一个数如果为负,则符号位为1,其余各位是对原码取反,然后整个数加1。
为了简单起见,我们用1个字节代表一个整数。+7的补码: 00000111
-7的补码: 第(1)步:11111000
+ 1
第(2)步:—————————
11111001
0的补码表示:
+0的补码: 00000000
-0的补码: 第(1)步:11111111
+ 1
第(2)步:—————————
1 00000000
第(3)步 进位1被丢弃
总结:当用补码来表示的时候,数值0在计算机中表示是唯一的,计算机采用的补码的这种形式。
6.补码(3):已知一个负数补码,将其转化为十进制数有三个步骤:
1.先对其各位取反;2.将其转化为十进制;
3.加上负号减去1;
例如:11111010,最高位为1,是负数,先对各位取反得00000101,转化为十进制为5,加上负号为-5,再减1得-6。
二、位运算
1.Java位运算:为了方便对二进制位进行操作,Java提供了四个二进制位操作:
& 按拉与| 按位或
^ 按位异或
~ 按位取反
举例:
1.按位与:一个房间里面有两个开关控制着房间的灯的明暗,当两个开关同进处于打开状态时,灯才能亮。
开关1 开关2 灯的状态关 关 暗
开 关 暗
关 开 暗
开 开 亮
01101101
& 00110111
00100101
结论:按位与,只有壹(1)壹(1)为1。2.按位或:一个房间里面有两个开关控制着房间的灯的明暗,当任何一个开关处于打开状态时,灯就能亮。
开关1 开关2 灯的状态关 关 暗
开 关 亮
关 开 亮
开 开 亮
01101101
| 00110111
01111111
结论:按位或,只有零(0)零(0)为0。
3.按位异或:一个房间里面有两个开关控制着房间的灯的明暗,当两个开关处于不同状态时,灯就能亮。
开关1 开关2 灯的状态关 关 暗
开 关 亮
关 开 亮
开 开 暗
01101101
^ 00110111
01011010
结论:按位异或,只有零(0)壹(1),或壹(1)零(1)为1。
4.按位取反:
~ 01101101—————————————
10010010
结论:对二进制数按位取反,即0变成1,1变成0。
三、移位运算符
1.Java中有三种移位运算符:
左移:<<带符号右移:>>
无符号右移:>>>
数 x x<<2 x>>>2
17 00010001 00 01000100 00000100 01
-17 11101111 11 10111100 00111011 11
2.整数常量进制表示:
1.八进制 0 开头2.十六进制 0X 或 0x 开头
问题:将一个整数110,从右端开始的4到7位全部变为0 ?