【问题标题】:Packing bits after masking in C在 C 中掩码后打包位
【发布时间】:2019-03-18 15:14:11
【问题描述】:

假设我有一个数字,并且我想将每隔一个位解释为一个新数字,例如

uint16_t a = 0b1111111000000001;
uint16_t mask = 0xAAAA; // 0b1010101010101010

我现在希望能够将所有其他位打包到两个 8 位变量中,例如

uint8_t b = a & mask ... //  = 0b11110000
uint8_t c = a & ~mask ... // = 0b11100001

有没有一种有效的方法来做到这一点?我知道我可以循环和移位,但我会为很多数字这样做。如果我能同时得到 b 和 c 就更好了。

【问题讨论】:

  • 我不知道你想做什么。 0xFF & 0xAA 是 0xAA。它不是 0xF0。从删除二进制符号开始,它很混乱。
  • @Lundin 他尝试实现 Compress 函数,这让 Hacker 很高兴。然而,在他的问题中,他表达了更大的期望,这是可以做到的。
  • 您正试图将结果放入uint8_t 变量中,但您的初始值为uint16_t类型,编译器会进行一些转换,您将丢失数据。
  • @Noxet 黑客的喜悦

标签: c bit-manipulation bitwise-operators


【解决方案1】:

如果您想避免过多的移位,可以预先计算一些表。

我这样做是为了a&mask。对于其他情况,它与a&~mask 相同。

首先,您执行 a& 掩码以将 1 放在 a 的未使用位置上。

假设你有a=a1 0 a2 0 a3 0 a4 0。你想得到号码a1 a2 a3 a4。可能性不大。

您可以有一个预先计算的短整数向量 V,并为每个条目关联相应的值。

例如,v[0b10100010] 将是 13,如果掩码是 0b10101010

如果预先计算的向量不是太大,它将保留在缓存 L1 中,因此速度会非常快,例如,如果您将数字分成 8 位或 16 位组。

【讨论】:

  • 这是一个非常好的主意。代码必须非常快,查找表可能是我最好的选择。
猜你喜欢
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 2012-07-21
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多