首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解按位操作

理解按位操作
EN

Stack Overflow用户
提问于 2013-10-06 03:10:19
回答 3查看 449关注 0票数 0

此代码段:

代码语言:javascript
复制
(x >>> 3) & ((1 << 5) - 1)

显然,结果是一个5位整数与位3-7的x.

你会怎么理解这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-06 03:21:18

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

  • 1 << 5在二进制中等于100000
  • 当我们减去1时,剩下的是11111,二进制数为51s。

现在,重要的是要了解a & 0b11111是一种只保留a中最不重要的5位的操作。回想一下,两个位的&是1当且仅当这两个位都是1。因此,a中高于第5位的任何位都将成为0,因为bit & 0 == 0。此外,从第1位到第5位的所有比特都将保留其原始值,因为bit & 1 == bit (0 & 1 == 01 & 1 == 1)。

现在,由于我们将xx >>> 3中的比特向下移动3,丢失了最不重要的三位x,所以我们将上面的过程应用于BIT4-8(从索引1开始)。因此,操作的结果只保留这些位(如果我们说第一个位是0位,那么就像您已经说过的那样,那就是第3位到第7位)。

让我们举一个例子:1234。以二进制表示,这是10011010010。所以,我们从3点开始:

代码语言:javascript
复制
10011010010 >>> 3 = 10011010    

从本质上说,我们只是修剪掉最后的3位。现在我们可以执行&操作了:

代码语言:javascript
复制
  10011010
& 00011111
  --------
  00011010

所以,我们的最终结果是11010。正如您所看到的,结果与预期的一样:

代码语言:javascript
复制
bits  |  1 0 0 1 1 0 1 0 0 1 0
index | 10 9 8 7 6 5 4 3 2 1 0
               ^-------^
票数 3
EN

Stack Overflow用户

发布于 2013-10-06 03:44:31

代码语言:javascript
复制
(x >>> 3)

在逻辑上移动x右3位,即在左侧不进行符号扩展。低阶3位丢失.(这相当于无符号除法8)。

代码语言:javascript
复制
1 << 5

移位1左5位,即将其乘以32,产生0b00000000000000000000000000100000.

代码语言:javascript
复制
-1

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

代码语言:javascript
复制
&

将它们结合在一起,只产生x >>> 3结果的低阶5位,换句话说,原始x.的3.7位。

票数 1
EN

Stack Overflow用户

发布于 2013-10-06 03:46:13

“你怎么理解这件事呢?”

我想你实际上是在问你该如何理解它。(与刚刚向你解释的人不同.)

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

  • 拿一张纸和一支铅笔。
  • 根据您对Java操作符优先工作方式的理解,确定执行操作的顺序。
  • 根据您对每个操作符的理解,在纸上写下位元的输入模式,并“手动执行”每个操作。按照正确的顺序。

如果你用几个x值做了几次,你就会明白为什么这个表达式会给你一个5位的数字。

如果你在其他几个例子中重复这个练习,你就不需要用铅笔和纸来完成这个繁琐的过程了。

我看到@arshajii实际上在这个例子中为您做了这件事。但我认为,如果你为自己做/重复工作,你会得到更深层次的理解。

关于Java中的整数和位操作,需要记住的一点是,这些操作总是使用32或64位操作来执行.即使操作数为8或16位。另一件需要记住的事情(尽管这里不相关)是shift操作符的右手操作数被切成5或6位,这取决于这是32位操作还是64位操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19205015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档