我正在学习C,我想知道是否可以在uint8_t
内放置几个uint64_t
。
例如,假设我要:
1010 1010(
uint8_t
)
并将其放在uint64_t
中,但位于“第7个”位置,例如:
0000 0000 1010 1010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
接下来,我可以添加另一个uint8_t
,例如
1111 1111
但在第0位。
如此:
0000 0000 1010 1010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111
这是我尝试过的方法,但由于它们是不同的类型,因此会出现错误。
void addToBitsAtPosition(uint8_t location, uint64_t *bits, uint8_t to_be_added)
{
// Somehow put at a location?
bits = bits << location;
bits = bits & to_be_added;
}
答案 0 :(得分:4)
您有正确的总体思路,但是代码中存在一些错误。您需要先将to_be_added
进行移位(首先将location
的值转换为 bits ,而不是 bytes ),然后按位或将移位后的值转换为bits
:
void addToBitsAtPosition(uint8_t location, uint64_t *bits, uint8_t to_be_added)
{
*bits |= ((uint64_t)to_be_added << (location * CHAR_BIT));
}
答案 1 :(得分:2)
void addToBitsAtPosition(uint8_t location, uint64_t *bits, uint8_t to_be_added)
{
*bits = *bits | (((uint64_t)to_be_added) << (location*8));
}
答案 2 :(得分:1)
为什么不使用工会? (如果您当然不必怀疑忍耐力)
typedef union
{
struct
{
uint8_t Byte0;
uint8_t Byte1;
uint8_t Byte2;
uint8_t Byte3;
uint8_t Byte4;
uint8_t Byte5;
uint8_t Byte6;
uint8_t Byte7;
};
uint64_t complete;
}My_uint64T;
My_uint64_t bits;
.....
//no you could do :
bits.complete = ob0000 0000 1010 1010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000;
bits.Byte7 = 0b11111111;
答案 3 :(得分:0)
即使比建议的解决方案更为冗长,您也可以尝试使用并集和数组来使代码保持整洁:
output.innerHTML = '';
答案 4 :(得分:-1)
void addToBitsAtPosition(uint8_t location, uint64_t *bits, uint8_t to_be_added)
{
*bits = *bits | (to_be_added << (location*8));
}