Поместите uint8_t внутрь uint64_t - PullRequest
0 голосов
/ 27 ноября 2018

Я изучаю C, и мне было интересно, возможно ли поместить несколько uint8_t s в uint64_t.

Например, скажем, я хочу:

1010 1010 (uint8_t)

и поместите его в uint64_t, но в положение "7", например:

0000 0000 1010 1010 0000 00000000 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 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 голосов
/ 27 ноября 2018

Даже если вы более многословны, чем предлагаемые решения, вы можете попытаться использовать союзы и массивы, чтобы сохранить ваш код довольно чистым:

void addToBitsAtPosition(uint8_t location, uint64_t *bits, uint8_t to_be_added) {
    union {
        uint64_t u64;
        uint8_t u8[8];
    } t;

    t.u64 = *bits;
    t.u8[location] = to_be_added;

    *bits = t.u64;
}
0 голосов
/ 27 ноября 2018

Почему бы не использовать союз?(Если вам, конечно, не нужно задумываться о порядке байтов)

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;
0 голосов
/ 27 ноября 2018
void addToBitsAtPosition(uint8_t location, uint64_t *bits, uint8_t to_be_added)
{
    *bits = *bits | (to_be_added << (location*8));
}
0 голосов
/ 27 ноября 2018
void addToBitsAtPosition(uint8_t location, uint64_t *bits, uint8_t to_be_added)
{
    *bits = *bits | (((uint64_t)to_be_added) << (location*8));
}
0 голосов
/ 27 ноября 2018

У вас правильная общая идея, но в вашем коде есть пара ошибок.Сначала необходимо сместить to_be_added (сначала преобразовать значение location в биты , а не байт ), а затем поразрядно ИЛИ смещенное значение в bits:

void addToBitsAtPosition(uint8_t location, uint64_t *bits, uint8_t to_be_added)
{
    *bits |= ((uint64_t)to_be_added << (location * CHAR_BIT));
}
...