【问题标题】:Expanding packed nibbles to 5-bit groups将压缩半字节扩展为 5 位组
【发布时间】:2018-12-20 06:47:39
【问题描述】:

我目前有一个 64 位的无符号整数,其中包含:

0100
0100
0100
0100
0000...

我会把它改成:

01000
01000
01000
01000
00000...

有没有办法做到这一点?

谢谢

【问题讨论】:

  • 真的很难说出你的要求 - 那些应该是你的 uint 的前 5 个半字节,其余的都是 0?如果是这样,我会提取 16 个半字节,将每一位向左移动并重新组合。
  • 我不能这样做,因为它是几何形状的表示。当该位设置为 0 时,什么都没有,当该位设置为 1 时,有一些东西
  • 您是否在可访问现代指令的现代硬件上执行此操作? Haswell(和更新的)和 Ryzen 有 PDEP 可以做到这一点

标签: bit-manipulation bitwise-operators bit


【解决方案1】:

? 嗨!您似乎正在尝试将 4 位半字节扩展为 5 位组。

一般来说,你可以这样做

uint64_t value = YOUR_DATA;  //this has your bits.
for (int i; i< sizeof(value)*2; i++) {
   uint8_t nibble = (value & 0xF);
   nibble <<= 1; //shift left 1 bit, add 0 to end.
   STORE(nibble, i);
   value>>=4;  //advance to next nibble         
}

这将为每组 4 位调用一次 STORE。 STORE 的参数是“扩展”的 5 位值和半字节计数器,其中 0 表示最低有效 4 位。

要回答的设计问题是如何存储结果? 64 位 / 4 * 5 = 80 位,因此您要么需要 2 个字,要么将数据放在一端。

假设 2 个单词的锚点位于 LSB,STORE 可能看起来像

 static uint64_t result[2] = {0,0};
 void STORE(uint64_t result[], uint8_t value, int n) {
    int idx = (n>12);                //which result word?
    result[idx] |= value << ( n*5 - idx*64 );
    if (n==12) result[1] |= value>>4; //65th bit goes into 2nd result word
 }

【讨论】:

    【解决方案2】:

    省略开头的 0,没有用 => 左移一位

    【讨论】:

    • 我不能,因为它是一个形状的表示,所以如果我删除前导 0,它将不会有相同的形状:/
    • 实际上没有办法在二进制中使用前导 0,您必须更具体地了解您想要实现的目标
    • @PieerotGG 如果您想在字符串或其他内容中使用它们而不是作为数字的二进制表示处理:将字符串格式化为具有固定长度并输入左移数字
    • 好吧:我使用 int64 来存储俄罗斯方块:我现在是我的俄罗斯方块(俄罗斯方块)的宽度,我希望能够在不改变俄罗斯方块形状的情况下改变它。所以我需要在每一行的末尾添加一个 0 。对不起我的英语我是法国人:)
    • @PieerotGG 啊明白了:使用矩阵,以防你使用 Python numpy 有你所追求的。本质上是多维数组。
    猜你喜欢
    • 2016-06-07
    • 1970-01-01
    • 2012-03-05
    • 2011-07-11
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多