理解按位运算

时间:2013-10-06 03:10:20

标签: java bit-manipulation

此代码段:

(x >>> 3) & ((1 << 5) - 1)

显然导致5位整数,其中第3 - 7位为x

你会如何理解这一点?

3 个答案:

答案 0 :(得分:3)

让我们先看看((1 << 5) - 1)

  • 1 << 5等于二进制100000
  • 当我们减去1时,我们留下11111,二进制数为5个。

现在,了解a & 0b11111是仅保留a的5个最低有效位的操作非常重要。回想一下,当且仅当两个位都是1时,两个位的&为1.因此,a以上的任何位都将变为0,因为bit & 0 == 0。此外,从第1位到第5位的所有位都将保留其原始值,因为bit & 1 == bit0 & 1 == 01 & 1 == 1)。

现在,因为我们将xx >>> 3的位向下移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
               ^-------^

答案 1 :(得分:1)

(x >>> 3)

逻辑上将x向右移位3位,即在左侧没有符号扩展。低3位丢失。 (这相当于8的无符号除法。)

1 << 5

1移位5位,即将其乘以32,得到0b00000000000000000000000000100000.

-1

从中减去一个,给出31,或0b00000000000000000000000000011111.

&

将这些组合在一起,仅产生x >>> 3结果的低位5位,换句话说,原始x.的位3..7

答案 2 :(得分:1)

  

“你会怎么理解这个?”

我认为你实际上在询问应该如何理解它。 (不同于有人向你解释......)

理解它的方法是“手动执行”它。

  • 拿一张纸和一支铅笔。

  • 根据您对Java运算符优先级如何工作的理解,找出执行操作的顺序。

  • 根据您对每个操作员的理解,在纸上写入位的输入模式,并按正确的顺序“手动执行”每个操作。

如果您使用x的几个值执行此操作几次,您应该理解为什么此表达式为您提供5位数字。

如果你在其他一些例子中重复这个练习,那么你应该达到一个不需要经历繁琐的铅笔和纸工作的过程。

我看到@arshajii基本上已经为你做了这个例子。但是如果你为自己做/重复工作,我想你会得到更深刻的理解。


关于Java中的整数和按位运算要记住的一件事是,操作总是使用32位或64位运算执行...即使操作数是8位或16位。要记住的另一件事(尽管这里不相关)是移位运算符的右手操作数被斩波为5或6位,具体取决于这是32位还是64位操作。