Создайте int из двоичных «компонентов» в C - PullRequest
3 голосов
/ 03 мая 2011

У меня есть несколько уравнений, которые будут возвращать двоичное значение для каждого из трех битов в моем числе.

Я программирую это на C, который является для меня новым языком.

Итакскажем, мои уравнения возвращают Y0 = 1, Y1 = 0 и Y2 = 1 (101);Я хочу сохранить это значение как 5.

Возможно ли это в C, если эти значения возвращаются различными уравнениями?

Я знаю, как это сделать путем умножения, но я ищудля функции или чего-то, что я представляю, уже встроено в C.

Ответы [ 4 ]

5 голосов
/ 03 мая 2011

Нет такой удачи. Вы должны умножить (или сдвинуть, что тоже самое)

unsigned Y0 = 1, Y1 = 0, Y2 = 1, val;

val = (Y0 * 4)  + (Y1 * 2)  + (Y2 * 1);  /* parens */
val = (Y0 << 2) + (Y1 << 1) + (Y2 << 0); /* redundant */
4 голосов
/ 03 мая 2011

В стандартной библиотеке C такой функции нет.

Вам нужно будет сделать:

int x = (Y2 << 2) | (Y1 << 1) | (Y0 << 0);
4 голосов
/ 03 мая 2011

Просто битовое смещение:

Y0 | (Y1 << 1) | (Y2 << 2)
1 голос
/ 03 мая 2011

Хотя это не очень популярно, у вас есть альтернатива, в которой вы можете использовать битовые поля для выполнения типа операции, о которой вы говорите.Итак, на ideone следующий код будет выполнять предложенное вами действие.

union combine {
    struct bits{
        int x: 1;
        int y: 1;
        int z: 1;
        int pad : 29;
    } bitvalues;
    int value;
};

int main() {
    union combine test;
    test.bitvalues.x = 1;
    test.bitvalues.y = 0;
    test.bitvalues.z = 1;
    test.bitvalues.pad = 0;
    printf("result: %d\n", test.value);
    return 0;
}

Однако важно отметить, что, поскольку вы используете комбинацию битовых полей исоюз, это не переносимое решение .Это зависит от порядка, в котором вы определяете свои биты, в соответствии с порядком бит / байт для целого числа на этом компьютере.Таким образом, есть способ сделать это без сдвига битов, но вам почти наверняка лучше пойти с решением сдвига битов.

...