C/C++ビット操作の概要

7291 ワード

前言では、ビット演算に困惑している人がいることに気づいたので、この簡単なチュートリアルを書いて、ビット演算がどのように操作されるかを説明することにしました.
ビットプロフィールビット、それは何ですか?あなたは聞くかもしれません.
簡単に言えば、ビットは1と0で、コンピュータの中でやっていることはすべてそれらから構成されています.コンピュータのすべてのデータはビットを使用しています.1バイトは8ビットからなる.1文字は2バイト、すなわち16ビットからなる.一方、2文字は4バイト、すなわち32ビットから構成される.
 0 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0

||              |               |               |              ||

|+- bit 31      |               |               |       bit 0 -+|

|               |               |               |               |

+-- BYTE 3 -----+--- BYTE 2 ----+--- BYTE 1 ----+-- BYTE 0 -----+

|                               |                               |

+----------- WORD 1 ------------+----------- WORD 0 ------------+

|                                                               |

+--------------------------- DWORD -----------------------------+


バイト、ワード、またはダブルワードを使用してビット操作を行うと、小さな配列や構造を使用するように美しく見えます.ビット演算を使用すると、個々のビットの値またはグループビットの値をチェックまたは設定できます.
16進数とビットの関係では,バイナリカウント法を用いて数字の比較を表すことが困難であることが分かった.この問題を回避するために,16進数カウント法(基数16)を用いた.
16進数の1桁の数字は0から15までそれぞれ2進数の4桁で表される.4ビットのグループ、すなわち半バイト.1バイトに2バイト半がある場合は、1バイトの値を2ビットの16進数で表すことができます.
             

======   =========

 0000        0

 0001        1

 0010        2

 0011        3

 0100        4

 0101        5

 0110        6

 0111        7

 1000        8

 1001        9

 1010        A

 1011        B

 1100        C

 1101        D

 1110        E

 1111        F

1バイトでアルファベット"r"(ASCIIコード114)の場合、以下のように表される.
0111 0010     

  7    2 
  :0x72

 
ビット演算子
  6     ,  :

  & 

  | 

  ^ 

  ~ 

 >> 

 << 

&演算子&(と)の演算には2つの演算値が必要で、1つの値が返され、2つの演算値がいずれも1の場合にのみ1が返されます.1&1==1&0==0&1==0&1==0&0==0バイトにビットフラグを含めることができ、和演算を使用してマスクを設定することでビットの値を確認できます.アルゴリズムは、バイトの4番目のビットが1であるかどうかを判断するために使用されます.
BYTE b = 50;

if ( b & 0x10 )

    cout << "Bit four is set" << endl;

else

    cout << "Bit four is clear" << endl;


    00110010  - b

  & 00010000  - & 0x10

  ----------

    00010000  - result

, 1。

|演算子|(または)演算子は、2つの演算値を必要とし、1つの値を返します.2つの演算値のうち1つが1であるか、いずれも1である場合にのみ、1を返します.以下の表:1|1==1|0==1 0|1==1 0|0==0使用または演算により、バイト内のビットが1であることを保証します.アルゴリズムは、2番目のビットが常に1であることを保証するために使用されます.
BYTE b = 50;

BYTE c = b | 0x04;

cout << "c = " << c << endl;


    00110010  - b

  | 00000100  - | 0x04

  ----------

    00110110  - result

   

   

^

^ ( ) , , 1 1 , 1。 :

   1   ^   1   ==   0

   1   ^   0   ==   1

   0   ^   1   ==   1

   0   ^   0   ==   0

  

。 0 1,1 0。 :
BYTE b = 50;

cout << "b = " << b << endl;

b = b ^ 0x18;

cout << "b = " << b << endl;

b = b ^ 0x18;

cout << "b = " << b << endl;


    00110010  - b

  ^ 00011000  - ^ 0x18

  ----------

    00101010  - result

   

    00101010  - b

  ^ 00011000  - ^ 0x18

  ----------

    00110010  - result

   

   

~

~( ) , 1 0, 0 1。 0, 1, 。 : 1, 0
BYTE b = ~0x03;

cout << "b = " << b << endl;

WORD w = ~0x03;

cout << "w = " << w << endl;


    00000011  - 0x03

    11111100  - ~0x03  b

    0000000000000011  - 0x03

    1111111111111100  - ~0x03  w

   

&( ) , 0。 : 0
BYTE b = 50;

cout << "b = " << b << endl;

BYTE c = b & ~0x10;

cout << "c = " << c << endl;


    00110010  - b

  & 11101111  - ~0x10

  ----------

    00100010  - result

   

   

>> <<

>>( ) <<( ) 。>> ,<< 。
BYTE b = 12;

cout << "b = " << b << endl;

BYTE c = b << 2;

cout << "c = " << c << endl;

c = b >> 2;

cout << "c = " << c << endl;


    00001100  - b

    00110000  - b << 2

    00000011  - b >> 2

   

   



。 , 。 : , , :
struct date_struct {

    BYTE day   : 5,   // 1 to 31

         month : 4,   // 1 to 12

         year  : 14;  // 0 to 9999

    } date;

   

, 5 , 4 , 14 。 23 。 。 12 。
|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|

  |                           |       |         |

  +------ year ---------------+ month +-- day --+

 

,date 。 BYTE。 BYTE 8 , , BYTE 。 8 , BYTE, 。 , 32 。

どのように席段を申明しますか.まず、ビットセグメント変数を明らかにし、コロンに従い、変数に割り当てられたビット数である.各セグメントはカンマで区切られ、最後に申明の終了をセミコロンで表します.
構造の申明が完了すると,アクセスタグにより容易に構造を使用できるとともに,アドレスオペレータを用いて構造のアドレスを用いて構造を操作することもできる.次のようになります.
date.day = 12;

dateptr = &date;

dateptr->year = 1852;