【问题标题】:is it possible to bit mask a char array是否可以对 char 数组进行位掩码
【发布时间】:2012-01-14 13:04:23
【问题描述】:

假设我有以下 char 数组

 char array[32];

我只想将此数组的 10 个最高有效位用作哈希值。

是否可以对这个 char 数组使用按位运算?

如果是这样,我该怎么做?

【问题讨论】:

  • 定义“10 个最高有效位”。
  • 这将取决于字节和位顺序以及存储在数组中的内容。您绝对可以对数组的各个字符进行位操作,但您需要定义“10 个最高有效位”以获得具体帮助。

标签: c bitwise-operators arrays


【解决方案1】:

假设您的实现有 8 位 char,并且您有一个 256 位数字以大端序存储在此数组中,这里如何访问 256 位数字的 10 msb。

uint16_t a;
a = (array[0] << 2 | (array[1] & 0xC0) >> 6) & 0x3FF;  

【讨论】:

  • 正确的想法,糟糕的实现。应该是(array[0]&lt;&lt;2) | ((array[1]&gt;&gt;6) &amp; 0x3)
  • @ugoren 我不同意。 ((array[1]&gt;&gt;6) &amp; 0x3) 可以,但只是(array[1] &amp; 0xC0) &gt;&gt; 6) 的另一种选择。当然,在这两种解决方案中,您最后都需要 &amp; 0x3FF,因为在 array[0] int 促销期间可能会扩展符号。
  • 现在你已经修复了它,它和我的代码一样。 &amp;0xc0 毫无意义,因为无论如何低位都会在移位中被删除。
  • @ugoren:我不得不同意 ouah。您建议使用的按位运算似乎执行完全相同的功能并且需要相同数量的周期。也许您正在考虑我遗漏的一些事情。如果是这样,请告诉我。
  • @ugoren 很抱歉,在您发表评论后我没有更改任何内容&amp; 0xC0 在我的代码中并非毫无意义,因为如果没有它,int 促销期间 array[1] 上的符号扩展将改变最终结果。
【解决方案2】:

我很确定你想要这样的东西(再次假设 8 位 chars 将大端存储在 array 中):

uint16_t a = (((uint16_t)array[0] & 0xFF) << 2 | ((uint16_t)array[1] & 0xFF) >> 6) & 0x3FF;

稍微分解一下:

uint16_t byte0 = (uint16_t)array[0] & 0xFF;
uint16_t byte1 = (uint16_t)array[1] & 0xFF;
uint16_t a = (byte0 << 2 | byte1 >> 6) & 0x3FF;

【讨论】:

  • 这似乎使用了来自array[0] 的2 位和array[1] 的所有位。你打算让array[1] 如此重要吗?
  • 呃,完全正确。我的意思是反过来。今天不是个好日子!
猜你喜欢
  • 2023-03-03
  • 2017-09-08
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多