Функция splitter()
здесь выполняет задание, о котором вы просите. К сожалению, это требует довольно много аргументов. Разделяется значение (value
), размер блока в наименее значимом конце значения (p1
), размер среднего фрагмента (p2
), а затем указатели на высокие, средние и низкие значения (hi_val
, md_val
, lo_val
).
#include <assert.h>
#include <inttypes.h>
#include <stdio.h>
static void splitter(uint32_t value, unsigned p1, unsigned p2, uint32_t *hi_val, uint32_t *md_val, uint32_t *lo_val)
{
assert(p1 + p2 < 32);
*lo_val = value & ((1U << p1) - 1);
value >>= p1;
*md_val = value & ((1U << p2) - 1);
value >>= p2;
*hi_val = value;
}
static void test_splitter(uint32_t value, int p1, int p2)
{
uint32_t hi_val;
uint32_t md_val;
uint32_t lo_val;
splitter(value, p1, p2, &hi_val, &md_val, &lo_val);
printf("0x%.8" PRIX32 " (%2u,%2u,%2u) = 0x%.4" PRIX32 " : 0x%.4" PRIX32 " : 0x%.4" PRIX32 "\n",
value, (32 - p1 - p2), p2, p1, hi_val, md_val, lo_val);
}
int main(void)
{
uint32_t value;
value = 0xFFFFFFFF;
test_splitter(value, 9, 11);
value = 0xFFF001FF;
test_splitter(value, 9, 11);
value = 0x000FFE00;
test_splitter(value, 9, 11);
value = 0xABCDEF01;
test_splitter(value, 10, 6);
test_splitter(value, 8, 8);
test_splitter(value, 13, 9);
test_splitter(value, 10, 8);
return 0;
}
test_splitter()
функция позволяет легко тестирование одного значения плюс секций он должен быть разделен на, и main()
вызывает функцию проверочной несколько раз.
Выход:
0xFFFFFFFF (12,11, 9) = 0x0FFF : 0x07FF : 0x01FF
0xFFF001FF (12,11, 9) = 0x0FFF : 0x0000 : 0x01FF
0x000FFE00 (12,11, 9) = 0x0000 : 0x07FF : 0x0000
0xABCDEF01 (16, 6,10) = 0xABCD : 0x003B : 0x0301
0xABCDEF01 (16, 8, 8) = 0xABCD : 0x00EF : 0x0001
0xABCDEF01 (10, 9,13) = 0x02AF : 0x006F : 0x0F01
0xABCDEF01 (14, 8,10) = 0x2AF3 : 0x007B : 0x0301
Если какой-либо из секций больше, чем 16, дисплей портится - но код все еще работает.
Теоретически значения 1U
могут быть 16-разрядными, но я предполагаю, что процессор работает с 32-битным int
. Существуют способы (UINT32_C(1)
), чтобы гарантировать, что это 32-битное значение, но это, вероятно, OTT. Код явно заставляет 32-разрядные целые значения без знака и печатает их как таковые.
Сдвинуть соответствующее количество мест и замаскировать результат числом с таким количеством битов, сколько хотите? например 'x & 7', чтобы получить младшие бит 0-2,' x >> 4 & 15', чтобы получить бит 4-7 ... – Ryan
Im путают, где вы получили 7, что приводит к битам 0-2 и 4-15, что приводит к бит 4-7? –
7 равно 111 в двоичном формате. 15 - 1111. 0-2 - 3 бита, а 4-7 - 4 бита. – Ryan