如何将64位整数数据类型拆分为8个8位类型?

时间:2013-11-18 06:58:37

标签: c types bit-manipulation

我想知道是否有一种简单的方法可以将一个64位(无符号长整型)变量分成八个8位(int8_t)?

只是为了澄清,这是一个例子:

unsigned long long _64bitVariable = 0x1001000100011001100100010001100110010001000110011001000110011111;
int8_t parts[8] = splitULongLong(_64bitVariable);

应该返回以下内容:

  

parts [0] = 0x10011111

     

部分[1] = 0x10010001

     

部分[2] = 0x00011001

     

...

     

部分[8] = 0x10010001

4 个答案:

答案 0 :(得分:1)

您应该可以使用联盟来分割数据,而无需任何移动或处理。

这会让你产生一个问题,即生成的表是错误的顺序,可以用宏(如果你有很多硬编码值)或简单的“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");
}

答案 1 :(得分:1)

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

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

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

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

BTW没有标准的"二进制"你似乎在假设整数的格式。

答案 2 :(得分:1)

我想如果可以的话:  64位数%8,保存此结果,然后减去结果,然后将结果除以8 最后保存分数num和save(64bit num%8)num,最后你得到两个8bit num,你可以使用这两个num代替64bit num。但是当你需要操作时,你可能需要运行8bit num到64 bit mun

答案 3 :(得分:0)

 {
   uint64_t v= _64bitVariable;
   uint8_t i=0,parts[8]={0};
   do parts[i++]=v&0xFF; while (v>>=8);
 }