[英]How can I multiply a 64-bit unsigned int with a 32-bit unsigned int on C without using long long?
[英]how do i split an unsigned 64 bit int into individual 8 bits? (little endian) in C
例如,我有uint64_t value = 42
,我想将其拆分为 8 个uint8_t
(8 位),小端。 但我不确定如何进行位移。 帮助将不胜感激。
无论字节顺序如何,这都有效:
uint64_t input = 42;
uint8_t values[8];
values[0] = input >> 0 & 0xFF;
values[1] = input >> 8 & 0xFF;
values[2] = input >> 16 & 0xFF;
values[3] = input >> 24 & 0xFF;
values[4] = input >> 32 & 0xFF;
values[5] = input >> 40 & 0xFF;
values[6] = input >> 48 & 0xFF;
values[7] = input >> 56 & 0xFF;
请注意, & 0xFF
在这里是多余的,但它使代码更清晰,并且如果您想对该值执行任何操作而不是立即将其分配给uint8_t
变量,它会很有用。
#define EXTRACT(u,b) ((u) >> (8 * (b)))
int foo(uint64_t x)
{
uint8_t b[8] = {
EXTRACT(x,0),
EXTRACT(x,1),
EXTRACT(x,2),
EXTRACT(x,3),
EXTRACT(x,4),
EXTRACT(x,5),
EXTRACT(x,6),
EXTRACT(x,7),
};
}
如果是小端,那么memcpy
就足够了:
void foo(uint64_t x)
{
uint8_t b[8];
memcpy(b, &x, sizeof(b));
}
如果您想要小端字节序,那么您可以执行以下操作:
为了获得第一个字节,您只需应用 AND 位掩码0xFF
。 这将屏蔽除 8 个最低有效位之外的所有位。
为了获得第二个字节,在应用位掩码之前右移 8 位。
为了获得第三个字节,在应用位掩码之前右移 16 位。
为了获得第四个字节,在应用位掩码之前右移 24 位。 (……)
为了获得第八个字节,在应用位掩码之前右移 56 位。
这是代码:
#include <stdio.h>
#include <stdint.h>
int main( void )
{
uint64_t value = 42;
uint8_t bytes[8];
//extract the individual bytes
for ( int i = 0; i < 8; i++ )
{
bytes[i] = value >> (8 * i) & 0xFF;
}
//print the individual bytes
for ( int i = 0; i < 8; i++ )
{
printf( "%2d ", bytes[i] );
}
printf( "\n" );
}
输出:
42 0 0 0 0 0 0 0
这是从我通常使用的 u64 数据中检索字节数据的指针方法。 只是与你分享。 但是这样一来,用户就不得不照顾订单了。
1 #include <stdio.h>
2 #include <stdint.h>
3
4 void main(void)
5 {
6 int i;
7 uint64_t v = 0x123456789abcdef0;
8 uint8_t* ptrb;
9
10 ptrb = (uint8_t*)&v;
11
12 for (i = 0; i < 8; i++)
13 {
14 printf("%2x ", ptrb[i]);
15 }
16
17 printf("\n");
18 }
下面是我的示例代码的输出,
$ ./foo
f0 de bc 9a 78 56 34 12
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.