您的位置:首页 > 编程语言 > Java开发

Java中运用位运算符的屏蔽技术求得整数的各个位

2017-08-14 20:55 218 查看

位运算符

3.5.3 位运算符

在处理整型数值时,可以直接对组成整型数值的各个位进行操作.这意味着可以使用屏蔽技术获得整数中的各个位.位运算符包括:

&(“与”),|(“或”),^(“异或”),~(“非”)

这些运算符在位模式下工作.例如,如果n是一个整型变量,并且用二进制表示的n从右数第4位为1,那么:

int fourthBitFromRight = (n & 0b1000) / 0b1000;


返回1,否则返回0.通过运用2的幂次方的&运算可以将其他位屏蔽掉,而只保留其中的某一位.

另外,”>>”和”<<”运算符将二进制位进行右移或左移操作.当需要建立位模式屏蔽某些位时,使用这两个运算符十分方便:

int fourthBitFromRight = (n & (1 << 3)) >> 3;


最后,>>>运算符将用0填充高位,<<运算符用符号位填充高位.没有<<<运算符.

注释:在C/C++中无法确定>>操作执行的是算术移位(扩展符号位),还是逻辑移位(高位添0).在执行中将会选择效率较高的一种.这就是说,在C/C++中,>>运算符实际上只是为非负数定义的.Java消除了这种含糊性.

上述是摘自《Java核心技术卷1》;0b1000是二进制数8,0b代表二进制数

以下是我的理解

———————————————————————————————————————————————————-

整型数据在内存中以二进制的形式表示,如一个int型变量在内存中占4个字节共32位,int型数据7的二进制表示是

00000000 _ 00000000 _ 00000000 _ 00000111


左面最高位是符号位,最高位0表示正数,是1表示负数。负数采用补码表示,如-8的补码表示是:

11111111 _ 11111111 _ 11111111 _ 11111000


这样就可以对两个整型数据实施位运算,即对两个整型数据对应的位进行运算得到一个新的整型数据。

1、“按位与”运算

“按位与”运算符“&”是双目运算符,对两个整型数据a,b按位进行运算,运算结果是一个整型数据c。运算法则是如果a,b两个数据对应位都是1,则c的该位是1,否则是0。如果b的精度高于a,那么结果c的精度和b相同。

例如:

***a:00000000 _ 00000000 _ 00000000 _ 00000111

& b:10000001_ 10100101 _ 11110011 _ 10101011

————————————————————————

***c:00000000_00000000 _ 00000000 _ 00000011

接下来就解释 :int fourthBitFromRight = (n & 0b1000) / 0b1000; 是什么意思。

二进制数:0b1000,只有第四位是1,其他位是0,所以(n & 0b1000)的结果是除了第四位之外都是0,当n的第四位是1的时候,(n & 0b1000)的第四位是1,假设第四位是1,其结果为:

(n & 0b1000):00000000 _ 00000000 _ 00000000 _ 00001000

所以int fourthBitFromRight = (n & 0b1000) / 0b1000=1;

2、“按位或”运算

“按位或”运算符“|”是二目运算符,对两个整型数据a,b按位进行运算,运算结果是一个整型数据c。运算法则是如果a,b两个数据对应都是0,则c的该位是0,否则是1。如果b的精度高于a,那么结果c的精度和b相同。

3、“按位非”运算

“按位非”运算符“~”是单目运算符,对于一个整型数据a按位进行运算,运算结果是一个整型数据c。运算法则是如果a对应位是0,则c的该位是1,否则是0。

4、“按位异或”运算

“按位异或”运算符“^”是二目运算符,对两个整型数据a,b按位进行运算,运算结果是一个整型数据c。运算法则是如果a,b两个数据对应位相同,则c的该位是0,否则是1。如果b的精度高于a,那么结果c的精度和b相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 位运算 技术