C: Как мне изменить биты в определенных позициях на конкретные значения? - PullRequest
0 голосов
/ 26 ноября 2018

Я пытался найти этот вопрос, но все остальные вопросы не относятся к моей проблеме.

Моя проблема: у меня есть что-то вроде 0xFreeFoodU, где я должен получить конкретные позиции и либо перевернуть их, либо сделать их1 или 0.

Так, например, биты в позициях 2, 6, 10, 14, 18, 22, 26 и 30 должны быть неизменными, тогда как биты в позициях 3, 7, 11, 15, 19, 23,27 и 31 следует изменить на 1. Я не хочу публиковать всю мою подсказку, потому что я не хочу обманывать и заставлять кого-то другого делать мои слова для меня.Но дать мне ответ хотя бы на один из них поможет миллионам.

Это битовая манипуляция.Но я понятия не имею, как манипулировать конкретными битами в определенных позициях.: (

EDIT Я не могу загрузить полную программу; она слишком длинная. Но у меня есть основная функция, где я вызываю нужную мне функцию. В идеале функция должна иметь возврат ина; пока у меня есть

return val_num ^ 0x22222222U; Но я должен добавить к нему. Мне нужна только помощь, как установить определенные биты в 1 и 0. Требуется ли маскировка?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Используйте битовый оператор ИЛИ (|), чтобы установить бит.

number |= (1 << bitposition);

Используйте битовый оператор И (&), чтобы очистить бит.

number &= ~(1 << bitposition);

Оператор XOR(^) может использоваться для переключения немного.

number ^= (1 << bitposition);

Это программа

#include<stdio.h>
void main()
{
        int a[] = { 3, 7, 11, 15, 19, 23, 27, 31},b = 1200,i;
        for(i=0;i<8;i++)
                b ^= (1 << a[i]);
        printf("%d\n",b);
}
0 голосов
/ 26 ноября 2018

Если вам удалось выполнить часть XOR, биты установки части в 1 практически одинаковы:

Создать маску со всеми битами:

unsigned int mask_0       = 0x....;      // bits that shall be set to 0

unsigned int mask_1       = 0x88888888;  // bits that shall be set to 1
// Note: this is 1<<3 | 1<<7 | 1<<11 ... All bits set that shall be changed

unsigned int mask_toggle  = 0x22222222;  // bits that shall be toggled
unsigned int value = 0xdeadbeef;

Выполнить требуемую операцию:

// toggle bits
value = value ^ mask_toggle;

// set bits to 1
value = value | mask_1;

// set bits to 0
value = value & ~mask_0;
...