2012-03-20 16 views
3

このプログラムは、最後の(ジュニア)変数と最後から2番目のバイトの変数i型intを移動します。私は、プログラマがこのビットシフトとその論理演算子

i = (i & LEADING_TWO_BYTES_MASK) | ((i & PENULTIMATE_BYTE_MASK) >> 8) | ((i & LAST_BYTE_MASK) << 8); 

は、誰もが下記のプログラムで起こっていただきました平易な英語で私に説明でき書いた理由を理解しようとしています。

#include <stdio.h> 
#include <cstdlib> 

#define LAST_BYTE_MASK 255 //11111111 
#define PENULTIMATE_BYTE_MASK 65280 //1111111100000000 
#define LEADING_TWO_BYTES_MASK 4294901760 //11111111111111110000000000000000 


int main(){ 
    unsigned int i = 0; 
    printf("i = "); 
    scanf("%d", &i); 
    i = (i & LEADING_TWO_BYTES_MASK) | ((i & PENULTIMATE_BYTE_MASK) >> 8) | ((i & LAST_BYTE_MASK) << 8); 
    printf("i = %d", i); 
    system("pause"); 
} 

答えて

6

発現が実際にビット回旋状であるが、本質的に、著者はこの行いますなお

// Mask out relevant bytes 
unsigned higher_order_bytes = i & LEADING_TWO_BYTES_MASK; 
unsigned first_byte = i & LAST_BYTE_MASK; 
unsigned second_byte = i & PENULTIMATE_BYTE_MASK; 

// Switch positions: 
unsigned first_to_second = first_byte << 8; 
unsigned second_to_first = second_byte >> 8; 

// Concatenate back together: 
unsigned result = higher_order_bytes | first_to_second | second_to_first; 

、16進表記を使用して、マスクを画定する小数を用いてより読み取り可能です。さらに、ここで#defineを使用することは誤っています。どちらもCおよびC++はconstを持っている:

unsigned const LEADING_TWO_BYTES_MASK = 0xFFFF0000; 
unsigned const PENULTIMATE_BYTE_MASK = 0xFF00; 
unsigned const LAST_BYTE_MASK = 0xFF; 

はあなたが&|とビットがare doing on the bit levelをシフトかを知る必要があり、このコードを理解します。

8

あなたはplain englishを求めたので、:彼は整数の最初と2番目のバイトを交換します。

3

その後、彼らはバイナリ表現に直接対応し、それはビットがオンとオフになっているかを確認するのは簡単ですので、それはむしろ、小数点よりも進数であなたのマスクを定義するために、より有益です:

#define LAST 0xFF   // all bits in the first byte are 1 
#define PEN 0xFF00   // all bits in the second byte are 1 
#define LEAD 0xFFFF0000 // all bits in the third and fourth bytes are 1 

その後

i = (i & LEAD)    // leave the first 2 bytes of the 32-bit integer the same 
    | ((i & PEN) >> 8)  // take the 3rd byte and shift it 8 bits right 
    | ((i & LAST) << 8) // take the 4th byte and shift it 8 bits left 
    ); 

したがって、2つの最上位バイトを同じままにして、2つの最下位バイトをスワップします。