C ++ бит сдвиг - PullRequest
       53

C ++ бит сдвиг

2 голосов
/ 12 мая 2010

Я новичок в работе с битами и байтами в C ++, и я смотрю на ранее разработанный код, и мне нужна помощь в понимании того, что происходит с кодом. Существует байтовый массив, который заполняет его некоторыми данными, и я заметил, что данные были '&' с 0x0F (см. Код, приведенный ниже). Я не очень понимаю, что там происходит ... если кто-то может объяснить это, это будет очень полезно. Спасибо! * * 1001

//Message Definition
/*
Byte 1: Bit(s) 3:0 = Unused; set to zero
Bit(s) 7:4 = Message ID; set to 10
*/

/*
Byte 2: Bit(s) 3:0 = Unused; set to zero
Bit(s) 7:4 = Acknowledge Message ID; set to 11
*/    

    //Implementation

    BYTE Msg_Arry[2];
    int Msg_Id = 10;
    int AckMsg_Id = 11;


    Msg_Arry[0] = Msg_Id  & 0x0F;       //MsgID & Unused
    Msg_Arry[1] = AckMsg_Id & 0x0F;     //AckMsgID & Unused

Ответы [ 3 ]

2 голосов
/ 12 мая 2010

0x0f - это 00001111 в двоичном формате. Когда вы выполняете побитовое и (&) с этим, это приводит к маскировке первых четырех битов символа (потому что 0 & anything всегда 0).

1 голос
/ 12 мая 2010
x & 0xF

возвращает младшие четыре бита данных.

Если вы думаете о двоичном представлении x и используете оператор and с 0x0f (00001111 в двоичном формате), старшие четыре бита x всегда будут равны нулю, а нижние четыре бита станут такими же, какими они были до операции .

0 голосов
/ 12 мая 2010

В данном примере это фактически ничего не делает. Msg_Id и AckMsg_Id меньше, чем 0x0F, поэтому маскировка их здесь не действует.

Однако использование побитового оператора and (&) для целочисленных типов выполняет бит для бита AND между заданными операндами.

...