2011-02-02 3 views
1

Как бы сделать следующее:битого сдвиг в C

unsigned short x = 0xFFFF; 
unsigned short y = 0xAE; 

x |= y & 1; 
x |= y & (1 << 1); 
x |= y & (1 << 2); 
x |= y & (1 << 3); 
x |= y & (1 << 4); 
x |= y & (1 << 5); 
x |= y & (1 << 6); 
x |= y & (1 << 7); 
x |= y & (1 << 8); 
x |= y & (1 << 9); 
x |= y & (1 << 10); 
x |= y & (1 << 11); 
x |= y & (1 << 12); 
x |= y & (1 << 13); 
x |= y & (1 << 14); 
x |= y & (1 << 15); 
printf("%x", x); 

Я хочу й равный 0xae, но он по-прежнему равен 0xFFFF.

+0

Ну, если вы уже знаете, что хотите, чтобы x равнялся, могу ли я предложить 'x = 0xAE'? –

+0

Непонятно. «x = y» будет делать то, что вы говорите. Вы хотите установить более низкие 8 бит x равными нижним 8 битам y, возможно? –

+0

Так что нет способа изменить бит, который уже равен 1 0? – Blade3

ответ

3

Все биты установлены уже в x - поэтому любая операция |= не изменит это.

0

C вычисляет правильную вещь, так как то, что вы здесь делаете, принимает y, ANDING с каждым битом от 0 до 15, который производит AE. Однако, тогда вы делаете OxFF | oxAE, который является oxFF. Попробуйте установить оператора привязки на &=. Это сделает 0xFF & 0xAE, который равен 0xAE.

1

Я думаю, что вы имели в виду, чтобы начать с

unsigned short x = 0x0000; 
3

Там нет необходимости рассматривать каждый бит отдельно. Весь метод можно просто свести к

x &= y; 
Смежные вопросы