将uint8_t放在uint64_t内

时间:2018-11-27 12:09:28

标签: c bit-manipulation bitwise-operators

我正在学习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;
}

5 个答案:

答案 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));
}