Java位运算
目录
一切的起源:二进制
位:二进制位,简称“位”。是二进制记数系统中表示小于2的整数的符号,一般用1或 0表示,是具有相等概率的两种状态中的一种。二进制位的位数可表示一个机器字的字长,一个二进制位包含的信息量称为一比特(bit)。
|
|
上文中的00000000 00000000 00000000 01011000即为十进制88转为二进制的 原码 ,与其相关的定义还有 反码 和 补码
关于原码、反码和补码
在计算机内,有符号数有三种表示法:原码、反码以及补码。
- 原码:就是二进制定点表示法,即最高位为符号位,“0”正负“1”,其余位表示数值的大小。
- 反码:正数的反码与其原码相同;负数的反码是对正数逐位取反,符号位保持为1。
- 补码:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
为什么要使用补码
简单来说,就是计算机计算减法时有各种不方便,于是发明了反码,结果发现反码也有缺陷(有两个零存在:“+0”和“-0”),进而发明了补码解决这个问题。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
有关补码的意义及作用在上面的链接里讨论的非常详尽,我这里就不班门弄斧了,理解就好~ 对原码、反码以及补码有一个初步的认知后,我们接下来再看位运算就会清晰很多。
位运算符的基本运算
操作符 | 描述 | 例子(A = 8, B = 9) |
---|---|---|
按位与& | 如果相对应位都是1,则结果为1,否则为0 | A&B=8,即1000 |
按位或 | 如果相对应位都是0,则结果为0,否则为1 | A | B=9,即1001 |
按位异或^ | 如果相对应位值相同,则结果为0,否则为1 | A^B=1,即0001 |
按位取反~ | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0 | ~A=7,即0111 |
左移 « | 按位左移运算符。左操作数按位左移右操作数指定的位数 | A « 2 = 32,即1000 00 |
右移 » | 按位右移运算符。左操作数按位右移右操作数指定的位数 | A » 2 = 2,即0010 |