我想知道是否有一种简单的方法可以将一个64位(无符号长整型)变量分成八个8位(int8_t)?
只是为了澄清,这是一个例子:
unsigned long long _64bitVariable = 0x1001000100011001100100010001100110010001000110011001000110011111;
int8_t parts[8] = splitULongLong(_64bitVariable);
应该返回以下内容:
parts [0] = 0x10011111
部分[1] = 0x10010001
部分[2] = 0x00011001
...
部分[8] = 0x10010001
答案 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);
}