2017-02-18 15 views
-5

В настоящее время у меня есть целочисленное значение, которое было прочитано из входного файла в виде шестнадцатеричного. Мне нужно разделить 32-битный бит-поток на три отдельные части, чтобы манипулировать им. Требуемый выход ниже:Разделение битовой строки на три части в C

требуемый выход:

В этом, V мой входном значении, слева является первой X1 цифрой, дальше, цифры между X1 и X2, а последним цифры от X2 до конца. Существует ограничение на то, что каждый подраздел должен быть больше 0.

Что делает это трудно, что место, где я разделив х меняется (X1 и X2 может измениться)

Есть хороший способ разделить эти вверх?

+1

Сдвинуть соответствующее количество мест и замаскировать результат числом с таким количеством битов, сколько хотите? например 'x & 7', чтобы получить младшие бит 0-2,' x >> 4 & 15', чтобы получить бит 4-7 ... – Ryan

+0

Im путают, где вы получили 7, что приводит к битам 0-2 и 4-15, что приводит к бит 4-7? –

+0

7 равно 111 в двоичном формате. 15 - 1111. 0-2 - 3 бита, а 4-7 - 4 бита. – Ryan

ответ

0

Функция 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-разрядные целые значения без знака и печатает их как таковые.

0

Если я понимаю ваш вопрос, вы хотите выделить данные. Посмотрите allocamalloc fucntions.

+0

Я не уверен, что это то, что требуется вообще. –

 Смежные вопросы

  • Нет связанных вопросов^_^