【问题标题】:What is happening with inclusive OR during a shift when combining bits [closed]合并位时,在移位期间包含 OR 会发生什么情况[关闭]
【发布时间】:2018-08-29 14:57:35
【问题描述】:

我知道这是一个初学者问题:这可能是我对计算机体系结构或寄存器不了解的问题,但是当您移位然后使用 | 时会发生什么(包括 OR)运算符?我了解使用 OR 可以打开位;

但以下内容让我“有点”困惑;例如,我已经看到将 Big endian 数据转换为 Little endian 的代码

int value = (buffer[i++] << 24) | (buffer[i++] << 16)
          | (buffer[i++] << 8) | buffer[i++]; 

在我自己的代码中,我通过以下方式转换了字节流:

short a = (short)(buffter[0] | (buffer[1] << 8));

但是这些 OR 对我来说没有意义,OR 不是用来打开位的吗?

       0101
       1100
Result:1101

如果我实际上以我理解的方式使用 OR,那么如果 byte[i] = 2 且 byte[i+1] =3,那么

0010 | 0011 = 0011 = 3。

在执行包含 OR 之前,是否使字节中的数据溢出到内存中更宽的位置? IE。 0010 | 0011 &lt;&lt; 4 等同于 00000010 | 00110000? 如果是这种情况,那么由于您不能永远填充 0,因此偏移量有多大?

【问题讨论】:

  • 选择一种语言:位移具有各种边缘条件和语言依赖性。
  • 这是 C#,但我对所有 c 语言都感兴趣。我会调整编辑我的问题。
  • 可能相关,因为我不相信那些多个i++ : stackoverflow.com/questions/12573816/…
  • 你没有0010 | 0011。这种转变正在扩大价值,所以你有类似0010 | 00110000
  • @Goku,不,你只需使用 i, i + 1, i + 2, i + 3,然后 i +=4 作为单独的语句。无论如何,这可能会更好,因为它可以说更具可并行性。

标签: c# bit-manipulation cpu-registers


【解决方案1】:

您对按位 OR 的工作原理的理解是正确的。如果设置了任一对应位,则设置结果位。

当您执行移位时,这些位会移动。所以二进制值0011左移4位给你00110000。如果你然后用 0010 或你得到:

  00000010
| 00110000
  --------
  00110010

至于多大的转变太大,这完全取决于类型。

【讨论】:

  • 按类型是指我存储的类型吗?即 int 32 总共不应超过 32 位或将字节移位 24 位?
  • @Goku An int 不保证为 32 位。它可能是 16 位。在开始摆弄它之前,您需要确保它的大小合适。
  • @NathanOliver 在 C# 中保证为 32 位。您正在考虑 C/C++。
  • @NathanOliver by int32 我应该说'Int32'(C#数据类型)
  • @itsme86 我刚刚注意到标签已更改。我仍然认为这被标记为 C++。
猜你喜欢
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多