繁体   English   中英

如何将一个64位数字拆分为八个8位值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM