как взломать это битовое поле? - PullRequest
0 голосов
/ 28 февраля 2011

Мне нужно написать функцию setbits(x,p,n,y), которая возвращает x с n битами, которые начинаются в позиции p, установленной в крайнее правое положение n битов переменной без знака y (оставляя другиебиты без изменений).

Например, если x = 10101010 (170 decimal) и y = 10100111 (167 decimal) и n = 3 и p = 6 говорят, что вам нужно убрать 3 бита y (111) и поместить их в x в положение 10xxx010 чтобы получить ответ 10111010.

Эта функция должна распечатать результат в двоичном виде.

Вывод должен быть таким:

x = 10101010 (binary)
y = 10100111 (binary)
setbits n = 3, p = 6 gives x = 10111010 (binary)

Привет, янаткнулся на эту проблему в битовом поле.Как мне это сделать?

Typedef struct {
    unsigned char x:8;
    unsigned char y:8;
} var;

Ответы [ 3 ]

0 голосов
/ 28 февраля 2011

t = y << (8-n) k = t >> p;print x & k;

Предполагая, что каждый битовый поток равен 8 битам.

0 голосов
/ 28 февраля 2011

char - недопустимый тип для битовых полей, они должны иметь тип int.Если вы используете char, вы вызываете поведение, определяемое реализацией, которое не охватывается стандартом C (см. ISO 9899: 1999 6.7.2.1 §4).

Таким образом, на ваш вопрос невозможно ответить, не зная, какая система и компиляторвы используете.

0 голосов
/ 28 февраля 2011

Битовые поля - это конкретное изобретение C, которое не имеет к этому никакого отношения.Например, у вас может быть

struct RGB16 {
   unsigned int R : 5;
   unsigned int G : 6;
   unsigned int B : 5;
};

, который представляет собой 16-битную структуру с 3 компонентами, каждый из которых меньше байта.Однако в стандарте C ничего не говорится об их относительном положении.Вы не можете предположить, что они изложены в памяти как RRRRRGGGGGGBBBBB.Кроме того, битовые поля постоянны, а в вашем случае необходимые биты являются переменными.Таким образом, поиск в Google для битовых полей C не поможет вам в этой проблеме.

Что касается вашей проблемы, вы должны знать, что x & binary(11000011) обнуляет средние 4 бита, а y | binary(00111100) устанавливает средние 4биты в один.

...