理解位运算
回答
我们先来看((1 << 5) - 1)
。
1 << 5
等于100000
二进制。- 当我们减去1时,我们剩下了,这是一个五进制数1。
现在,重要的是要明白,a & 0b11111
是一种操作,只保留a
的5个最低有效位。回想一下,当且仅当两个比特都是1时,两个比特的&
是1.因此,在第5比特之上的a
中的任何比特因此将从bit & 0 == 0
变为0。而且,由于bit & 1 == bit
(0 & 1 == 0
和1 & 1 == 1
),位1到位5的所有位都将保留其原始值。
现在,因为我们在x >>> 3
移位的x
位下降3,失去的x
三个最低位显著,我们应用上述的比特的处理4〜8(开始于索引1)。因此,操作的结果只保留那些位(如果我们说第一位是位0,那么确实是位3到位7,正如你所说的那样)。我们举一个例子:1234
。在二进制中,这是10011010010
。所以,我们从3开始移位:
10011010010 >>> 3 = 10011010
基本上我们只是修剪掉最后3位。现在,我们可以执行&
操作:
10011010
& 00011111
--------
00011010
这样,最终的结果是11010
。正如你所看到的,如预期的结果:
bits | 1 0 0 1 1 0 1 0 0 1 0
index | 10 9 8 7 6 5 4 3 2 1 0
^-------^
谢谢!很好解释。 –
(x >>> 3)
班次x
右侧3位从逻辑上讲,左侧即没有符号扩展。低阶3位丢失。 (这相当于一个无符号除以8)
1 << 5
位移1
左5个比特,即,由32相乘,得到0b00000000000000000000000000100000.
-1
减去一个来自,给予31或0b00000000000000000000000000011111.
&
AND将这些一起,仅产生低阶的x >>> 3
结果的5位,在其他字位3 ..7原来x.
“你会怎么去理解这个?”。
我假设你实际上在问你如何应该去理解它。 (与仅仅向你解释它的人不同...)
理解它的方法是“手执”它。
拿一张纸和一支铅笔。
根据您对Java运算符优先级如何工作的理解,找出操作的执行顺序。
根据您对每位操作员的理解,在纸上写入位的输入模式,并按正确的顺序“手执”每项操作。
如果你这样做与x
几个值几次,你应该明白为什么这个表达式给你一个5位数字。
如果您为其他几个示例重复练习,您应该到达不需要用铅笔和纸张进行繁琐过程的地步。
我看到@arshajii基本上为你做了这个例子。但是我认为如果你为自己做/重复工作,你会得到更深的理解。
有一点要记住在Java中的整数和位操作是,操作总是使用32位或64位运算......即使操作数是8位或16位执行。另一件需要记住的事情(尽管这里不重要)是,移位运算符的右侧操作数被切分为5或6位,这取决于它是32位还是64位操作。
好的Stephen,我会看看一些其他的位操作代码,并试图理解它做了什么。谢谢! –
- 1. 理解模运算
- 2. 理解模运算%
- 3. 理解FFT运算片断
- 4. 理解指针运算
- 5. 了解按位运算 - 移位和AND
- 6. 努力理解python中的按位运算符
- 7. 不能理解按位运算的用法
- 8. 无法理解移位运算符行为在C代码
- 9. Python和OpenCV - 我如何理解这个按位运算符?
- 10. 红宝石位运算解决
- 11. 需要帮助了解位运算符
- 12. 解释使用位运算符
- 13. 按位运算符的工作原理
- 14. 和C预处理位运算符
- 15. 位运算
- 16. 位运算
- 17. PHP,位运算
- 18. 位运算符
- 19. Ç位运算
- 20. 按位运算
- 21. 位运算符
- 22. 位运算
- 23. 理解的CComBSTR赋值运算符
- 24. 的Javascript XOR运算(试图理解!)
- 25. 理解条件运算的scala
- 26. 理解XOR逻辑运算符
- 27. 理解运算符优先级
- 28. 不能理解点运算符概念
- 29. 理解赋值运算符 - javascript
- 30. Probem理解nodejs中的OR运算符
是的,Java。 15char –