一个关于位与运算的问题
对于《JAVA核心技术 卷1》(第11版) page43 第三章 3.5.8一节中有个描述如下:
如果n是一个整数变量,而二进制表示的n从右边数第四位1,则
int forthBitFromRight = (n & 0b1000) / 0b1000;
会返回 1,否则会返回 0。利用&并结合使用适当的2的幂,可以把其他位掩-掉,而只留下其中的某一位。
本来怎么都看不明白,后来在jshell中找几个数试了一下,顿时恍然大悟,现在把经验分享给大家。
jshell> 0b1000000010110100 & 0b1000
$12 ==> 0
jshell> 0b1000000010111100 & 0b1000
$13 ==> 8
jshell> 251 & 8
$17 ==> 8
jshell> 357 & 8
$18 ==> 0
对于如上问题,分析如下:**
n是一个正整数,先来看n & 0b1000
的结果,我们都知道在java中,用0b开头表示二进制,而&是位与运算。
1 位与运算
位与运算规则是将操作数都换成二进制,然后按位对齐,同1则1,不同则0。(可以想象成是进行逻辑与判断,两个条件都true的情况下才是true,否则为false。)
如:
1001 | 1100 | 1001 |
---|---|---|
0100 | 0010 | 0011 |
0000 | 0000 | 0001 |
所以,1001 1100 1001 & 0100 0010 0011 = 1
2 n & 0b1000
当且仅当n从右数第4位为1时(二进制),该表达式的结果为nb1000,否则表达式为0。
3 结果
当n=0时,结果为0。
当n=0b1000时,结果为1。
虽然不知道这种有什么用,但是解决了一个不懂得问题还是很开心。