java基础系列之二:位运算符

2014-11-24 03:14:10 · 作者: · 浏览: 0

1、计算机中数据的表示方法

计算机是一种电子设备,有复杂的电子元器件组合而成,一个电子元器件有带点和不带点两种状态,通常我们将带点状态表示为数值1,不带点状态表示为数值0,多个这样的元器件的组合可以表示更多状态,也就是可以表示更多的数据,如000表示0,001表示1,010表示2,011表示3。一个元器件可表示一位数据,这种表示数据的方式就叫二进制。在实际的电子设备中,我们将8个这样的元器件形成一个单元,这样的单元叫一个字节,一个字节能表示的数值范围是0-255。

一个字节由8个二进位组成,其中最右边的一位称为“最低有效位”或“最低位”,最左边的一位称为“最高有效位”或“最高位”。没一个二进位的值是0或1。

二进制计数的缺点:书写太长,容易出错,一般计算机中的数据位数都是4的整数倍,所以,在计算机里通常采用16进制计数法。用数字可以表示各种信息,计算机里只有数值,当你在内存中看到一个数值时,这个数值可能代表各种意义。

2、原码、反码和补码

1>原码:

将最高位作为符号位(以0代表正,1代表负),其余各位代表数值本身的绝对值(以二进制表示)。例如:

+7的原码为:00000111

-7的原码为:10000111

问题:

+0的原码为:00000000

-0的原码为:10000000

由于0的表示不唯一,所以计算机中数值没有采用原码表示形式。

2>反码:

一个数如果为正,则它的反码与原码相同,一个数如果为负,则符号位为1,其余各位是对原码取反。例如:

+7的反码为:00000111

-7的反码为:11111000

问题:

+0的反码为:00000000

-0的反码为:11111111

由于0的表示依然不唯一,所以计算机中数值没有采用反码表示形式。

3>补码:

利用溢出,可以将减法变为加法。

对于十进制,如果从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。

在计算机中,如果我们用一个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为:

1 00000000

进位1被丢弃。

一个数如果为正,则它的原码、反码、补码相同;一个数如果为负,则符号位为1,其余各位是对原码取反,然后整个数加1。例如:

+7的补码为:00000111

-7的补码为:11111000

+ 1

= 11111001

+0的补码为:00000000

-0的补码为:11111111

+ 1

=100000000 进位1被丢弃

= 00000000

已知一个负数的补码,将其转换为十进制数,步骤:

①先对各位取反;

②将其转换为十进制数;

③加上负号,再减去1;

例如:11111010,最高位为1,是负数,先将各位取反得00000101,转换为十进制数得5,加上负号得-5,再减1得-6。

3、位运算符

为了方便对二进制位进行操作,java提供了四个二进制位操作符。

& 按位与

| 按位或

^ 按位异或

~ 按位取反

1>按位与:只有壹壹为1。

0&0=0

0&1=0

1&0=0

1&1=1

2>按位或:只有零零为0。

0|0=0

0|1=1

1|0=1

1|1=1

3>按位异或:只有零壹或壹零为1。

0^0=0

0^1=1

1^0=1

1^1=0

4>按位取反:

对二进制数按位取反,即0变成1,1变成0。

4、移位运算符

java中有三个移位运算符

左移:<< www.2cto.com

带符号右移:>>

无符号右移:>>>

例如:

数 x x<<2 x>>2 x>>>2

17 00010001 01000100 00000100 00000100

-17 11101111 10111100 11111011 00111011



xiadaoceshen的专栏