java 核心技术 3.5.10 位运算符

原文

3.5.10 位运算符

处理整型类型时,还有一些运算符可以直接处理组成整数的各个位。这意味着可以使用掩码技术得到一个数中的各个位。位运算符包括:

&(and) 、 |(or) ^(xor) ~(not)

这些运算符按位模式操作。例如,如果n是一个整数变量,而且n的二进制表示中从右边数第一位是1,则

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

会返回1 ,否则返回0 。利用 & 并结合适当的2的幂,可以屏蔽其他位,而只留下其中的某一位。

注释:应用在布尔值上时,& 和 | 运算符也会得到一个布尔值。这些运算符与 && 和 || 运算符很类似,不过 & 和 | 运算符不采用“短路”方式来计算,也就是说,计算结果之前,两个操作数都需要计算。

另外,还有 >> 和 << 运算符可以将位模式左移或右移。需要建立位模式来完成位掩码时,这两个运算符会很方便:

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

最后,>>> 运算符会用0填充高位,这与 >> 不同, >>会用符号位填充高位。不存在 <<< 运算符。

警告:移位运算符的右操作要完成模32的操作(除非左操作数是long类型,在这种情况下需要完成模64运算)。例如,1 << 35的值等同于 1<< 3 或 8

C++注释:在C/C++中,不能保证 >>是完成算术移位(扩展符号位)还是逻辑移位(填充0)。实现者可以选择其中更高效的任何一种操作。这意味着C/C++中的 >> 运算符对负数生成的结果可能会依赖于具体的实现。Java则消除了这种不确定性。

个人补充

位运算在开发中应用并不多,甚至很多地方为了“照顾整个小组的水平”,不建议,或者禁止使用位运算。位运算是直接操作计算机底层的二进制数,所以效率高,但可读性很差。

比如1 的二进制为 000...001 (31个0,最后是1,int 是32 位)

对1进行 << 操作也就是所有的32位都左移,最左边的就会溢出,被舍弃,而右边空出来一位,补位0,结果就是 000...0010(30个0,然后是10,也就是二进制 的10,也就是2)。

同理 1 << 3 就是整体左移3位,其结果为000...001000(28个0,然后是1000,也就是二进制 的1000,也就是8) 。

关于二进制与十进制的转换,可以使用windows的计算器。

展开阅读全文

页面更新:2024-03-06

标签:可能会   负数   高效   可读性   算术   整数   高位   符号   也就是   操作

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top