2017-02-13 50 views
1

У меня есть байт, значение которого в двоичном формате равно 11111111. Я должен продлить мой байт до 16 бит 0101010101010101 в соответствии с этими правилами: если бит = 1, теперь равен 01. Если бит = 0, теперь это 10.Как я могу маскировать биты?

Например:

00001111 -> 1010101001010101 
00000101 -> 1010101010011001 

Какова операция для этого?

+0

Почему вы маскируете байт с 16-битной маской? Планируете ли вы поместить свой байтовый объект в 16-битное слово? –

+0

Вы понимаете, что байт (как правило, теперь дни) имеет только 8 бит вправо. Как вы планируете выращивать свои байты? –

ответ

0

Я не думаю, что есть оператор для «расширяющихся» битов, как описано. Но вы могли бы сделать это в цикле вместе с сдвигом и тестирования бит следующим образом:

unsigned char b = 0xff; 
unsigned int result = 0x0; 

for (int i=0; i<8; i++) { 
    result <<= 2; // make place for the next 2 bits 

    int isSet = b & 0x80; // check highest significant bit of b 
    if (isSet) { 
     result |= 0x01; // in bits: 01 
    } 
    else { 
     result |= 0x02; // in bits: 10 
    } 

    b <<= 1; 
} 

Надеется, что это помогает.

+0

Вот и все! Спасибо –

+0

Добро пожаловать. Пожалуйста, не забудьте принять ответ, если он решил вашу проблему ... –

1

Во-первых, преобразовать байт к INT:

int x = (int)byte_value; 

Затем, продлить до 16 бит, путем сдвига битов 4 за один раз, а затем 2, затем 1, то в два раза каждый бит со сдвигом и побитового ИЛИ:

x = ((x << 4) | x) & 0b0000111100001111; 
x = ((x << 2) | x) & 0b0011001100110011; 
x = ((x << 1) | x) & 0b0101010101010101; 
x = (x << 1) | x; 

Затем маскировать биты таким образом, что даже позиции битов 1, если бит равен 1, а нечетные позиции 1, если бит равен 0 (с использованием побитового НЕ):

x = (x & 0b0101010101010101) | (~x & 0b1010101010101010); 
+0

Остерегайтесь: если когда-либо байтовый знак будет подписан char, тогда преобразование в int будет выполнять расширение знака и может заполнить все, но с низким 8 бит с 1. –

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

  • Нет связанных вопросов^_^