[英]How to split a 64-bit number into eight 8-bit values?
有没有一种简单的方法可以将一个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
您应该能够使用联合来拆分数据,而无需进行任何移动或处理。
这给您带来的问题是,结果表的顺序错误,可以使用宏(如果您有很多硬编码值)或简单的“ 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");
}
首先,您不应该使用带符号的值来玩这类游戏,这只会使问题复杂化。 然后,您不应直接使用unsigned long long
,而应使用适当的固定宽度类型uint64_t
。 这可以是unsigned long long
时间unsigned long long
,但不一定。
您可以通过对值进行移位和屏蔽来获得这样整数中的任何字节(假定为8位):
#define byteOf(V, I) (((V) >> (I)*8)&UINT64_C(0xFF))
要初始化数组,您可以将对宏的调用放在初始化器中。
顺便说一句,您似乎假设没有整数的标准“二进制”格式。
我想如果是这样的话:64bit num%8,保存此结果,然后减去结果,然后将结果除以8,最后保存num并保存(64bit num%8)num,最后得到两个8bit num,并且您可以使用这两个num替换64bit num。但是,当您需要操作时,可能需要将8bit num转换为64 bit mun。
{
uint64_t v= _64bitVariable;
uint8_t i=0,parts[8]={0};
do parts[i++]=v&0xFF; while (v>>=8);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.