2017-02-16 5 views
0

Я пытаюсь решить вопрос, который говорит,Обновление битовые поля в C

Инициализировать новую переменную в значение 17512807u.

Предположим, что число, как обычно, должно быть от 0 как наименее значимое (справа от ) до 31 (наиболее значимое, слева). Обновить биты с 18 по 21 с целым значением 8 и битами с 10 по 14 со значением 17 (десятичный). Распечатайте полученное значение в виде восьмизначного шестнадцатеричного числа , чтобы показать все цифры.

Я понимаю, что мне нужно делать, и мой код работает нормально, но мне сказали, что мой ответ неверен.

#include <stdio.h> 

int main(){ 
    int value = 17512807u; 
    int L = 21; // starting left position 
    int R = 18; // starting right position 

    int mask = (1 << (L - R + 1) - 1) << R; 
    int newField = (8 << R) & mask; // integer value 8, shifting to right 
    int newValue = value & (~mask); // remove range of bits 
    value = newField | newValue; // update range of bits 

    L = 14; 
    R = 10; 

    mask = (1 << (L - R + 1) - 1) << R; 
    newField = (17 << R) & mask; 
    newValue = value & (~mask); 
    value = newField | newValue; 

    printf("%08x\n", value); 
} 

Поскольку я не знаю, правильный ответ, и единственная информация, я дал, что мой ответ не так, я не понимаю, что я делаю неправильно.

+0

В последнее время [попросил ОП здесь] (http://stackoverflow.com/questions/42259429/updating-fields-of-bits-incorrectly). Почему вы все еще используете 'int' для значения' 17512807u' после того, как вам рекомендуется использовать 'unsigned'? –

+0

@WeatherVane Я пробовал это, он ничего не меняет –

+0

Итак, я думаю, вы продолжите игнорировать это [хороший совет] (http://stackoverflow.com/questions/42259429/updating-fields-of-bits-incorrectly# комментарий71677181_42259429) от @Olaf? Я не понимаю, почему люди задают вопросы, а затем продолжают слепо. –

ответ

0

Похоже, что вас попросят использовать битовые поля. Например, если тип

struct bits{ 
    int a:5; 
    unsigned short b:3; 
    unsigned char c:2; 
    bool d:1; 
}; 

выше struct будет иметь 4 членов, каждый из конкретной битовой длины.

Если вы union, что структура с int, вы получаете «двойное представление» бит. В списке полей или как единое целое:

union U{ 
    struct bits fields; 
    int i; 
}; 

Теперь код, как

U u; 
u.i = 0; 
u.fields.b = true; 

становится действительным и дает вам доступ к любому целому числу или отдельных битовых полей.

+0

Хм, я думал, что только определенные типы, доступные для битового поля, это '_Bool, int, signed int, unsigned int.'' char c: 2' может быть проблемой. – chux

+0

Может захотеть отправить ответ на http://stackoverflow.com/q/42259429/2410359 – chux

+0

Спасибо, @chux. Обновил ответ и перекрестил его. – YePhIcK

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