【问题标题】:How to split a 64-bit number into eight 8-bit values?如何将 64 位数字拆分为 8 个 8 位值?
【发布时间】:2013-12-01 06:08:13
【问题描述】:

有没有一种简单的方法可以将一个 64 位 (unsigned long long) 变量拆分为八个 int8_t 值?

例如:

//1001000100011001100100010001100110010001000110011001000110011111
unsigned long long bigNumber = 10455547548911899039;
int8_t parts[8] = splitULongLong(bigNumber);

parts 类似于:

[0] 10011111

[1] 10010001

[2] 00011001

...

[7] 10010001

【问题讨论】:

  • 位移是你的朋友
  • 您可以使用演员表:(int8_t *)&_64bitVar。不过请注意大/小端。
  • 是的,你关心字节序吗?这里的最终目标是什么?
  • @Potatoswatter 字节序是最重要的。目标是通过一维值验证二维板上的邻接性。
  • 我不明白字节序对于检查邻接性有多么重要。

标签: c types bit-manipulation


【解决方案1】:
 {
   uint64_t v= _64bitVariable;
   uint8_t i=0,parts[8]={0};
   do parts[i++]=v&0xFF; while (v>>=8);
 }

【讨论】:

    【解决方案2】:

    您应该能够使用联合来拆分数据,而无需进行任何移动或处理。

    这会给您留下结果表顺序错误的问题,这可以通过宏(如果您有很多硬编码值)或简单的“8-x”下标计算轻松解决。

    #define rv(ss) = 8 - ss;
    
    
    union SameSpace {
    unsigned long long _64bitVariable;
    int8_t _8bit[8];
    } samespace;
    
    _64bitVariable = 0x1001000100011001100100010001100110010001000110011001000110011111;
    
    if (_8bit[rv(1)] == 0x10011111) {
       printf("\n correct");
    }
    

    【讨论】:

    • 这个答案采用问题对二进制的0x符号的使用,这在C中不起作用。
    • rv宏定义存在三个问题:类函数宏不能在宏名后括号前有空格,替换列表中出现的参数名应加括号,以及它不可移植(不考虑不同实现中的不同字节序)。
    • @Eric Postpischil - 感谢您的语法检查。我目前没有可用的 C 编译器 :-)
    • 当心,我建议使用联合 previously 和 @Nils Pipenbrinck 足够精明地注意到联合在 c 标准中是未定义的。
    • 这种方法在大小端机器上的工作方式会有所不同?
    【解决方案3】:

    我想如果可以的话: 64bit num %8 ,保存这个结果,然后减去结果再除以8 last save 分 num 和 save (64bit num %8) num,最后得到两个 8bit num ,可以用这两个 num 代替 64bit num 。但是当需要操作时,可能需要将 8bit num 操作为 64比特币

    【讨论】:

    • %8 保留最低 3 位,而不是 8 位,您需要 %256(或 & 255)来屏蔽最低 8 位。
    【解决方案4】:

    首先,您不应该玩带有符号值的此类游戏,这只会使问题复杂化。那么你不应该直接使用unsigned long long,而是适当的固定宽度类型uint64_t。这可能是unsigned long long,但不一定。

    这样一个整数中的任何字节(假设为 8 位)都可以通过移位和屏蔽值来获得:

    #define byteOf(V, I) (((V) >> (I)*8)&UINT64_C(0xFF))
    

    要初始化您的数组,您可以在初始化程序中调用该宏。

    顺便说一句,正如您所假设的那样,整数没有标准的“二进制”格式。

    【讨论】:

    • @EricPostpischil,通过使用值 0 .. 7I 重复它。
    猜你喜欢
    • 1970-01-01
    • 2013-02-13
    • 2011-06-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多