49

私は、Kochan の本「Programming in Objective-C」で Objective-C のビット演算子について読んでいます。

私はこの部分について非常に混乱していますが、これまでに提示された他のほとんどすべてを本当に理解しています.

ここに本からの引用があります:

ビットごとの AND 演算子

ビット単位の ANDing は、マスキング操作によく使用されます。つまり、この演算子は、データ項目の特定のビットを 0 に設定するために簡単に使用できます。たとえば、ステートメント

w3 = w1 & 3;

これは、w1 の値を定数 3 とビットごとに AND 演算したものを w3 に割り当てます。これは、w の右端の 2 ビットを除くすべてのビットを 0 に設定し、w1 の右端の 2 ビットを保持するという同じ効果があります。

C のすべてのバイナリ算術演算子と同様に、バイナリ ビット演算子は、等号を追加することによって代入演算子としても使用できます。ステートメント

word &= 15;

したがって、次と同じ機能を実行します。

word = word & 15;

さらに、ワードの右端の 4 ビットを除くすべてを 0 に設定する効果があります。ビット単位の演算を実行する際に定数を使用する場合は、通常、定数を 8 進数または 16 進数で表す方が便利です。

わかりました、それが私が理解しようとしていることです。今、私はこの概念全体のほとんどに非常に混乱しており、誰かが私を助けてくれるかどうかを少し明確にしたいと思っています.

本が「すべてのビットを設定する」と言及しているとき、すべてのビット..正確にはビットとは何ですか。2進数、つまり2進数で0か1じゃないですか?

もしそうなら、最初の例で、「一番右の 2」を除くすべてのビットが 0 になっているのはなぜですか? 定数から 3 を取って 3 - 1 なので 2 ですか?

ありがとう!

4

4 に答える 4

150

数値は、次のように 2 進数で表すことができます。

3    = 000011
5    = 000101
10   = 001010

...等。バイナリに精通していると仮定します。

ビットごとの AND は、2 つの数値を取り、それらを互いに並べて、両方の数値が 1 である (それ以外はすべて 0) 1 を持つ新しい数値を作成することを意味します。

例えば:

    3          =>  00011
  & 5          =>  00101
------           -------
    1              00001

ビットごとの OR は、2 つの数値を取り、それらを互いに並べて、いずれかの数値が 1 である (それ以外はすべて 0 である) 1 を持つ新しい数値を作成することを意味します。

例えば:

    3          =>  00011
  | 5          =>  00101
------           -------
    7              00111

ビット単位の XOR (排他的 OR) とは、2 つの数値を取得し、それらを互いに並べて、いずれかの数値が 1 で、もう一方の数値が 0 である 1 を持つ新しい数値を作成することを意味します (それ以外はすべて 0)。

例えば:

    3          =>  00011
  ^ 5          =>  00101
------           -------
    6              00110  

ビット単位の NOR (Not OR) とは、2 つの数値のビット単位の OR を取り、すべてを逆にすることを意味します (0 があった場所は 1 になり、1 があった場所は 0 になります)。

ビット単位の NAND (Not AND) は、2 つの数値のビット単位の AND を取り、すべてを逆にすることを意味します (0 があった場合は 1 になり、1 があった場合は 0 になります)。

word &= 15続き:右端の 4 ビットを除くすべてを 0 に設定するのはなぜですか? これで解るはず…

     n          =>  abcdefghjikl
  & 15          =>  000000001111
------            --------------
     ?              00000000jikl

( 0 AND a = 00 AND b = 0、 ... j AND 1 = ji AND 1 = i、 ...)

これはどのように役立ちますか?多くの言語では、「ビットマスク」と呼ばれるものを使用します。ビットマスクは、本質的には、結合された小さな数値の全体を表す数値です。OR を使用して数字を結合し、AND を使用してそれらを引き離すことができます。例えば:

int MagicMap = 1;
int MagicWand = 2;
int MagicHat = 4;

地図と帽子しかない場合は、それを次のように表現できmyInventoryBitmask = (MagicMap | MagicHat)ます。結果はビットマスクです。何も持っていない場合、ビットマスクは 0 です。杖を持っているかどうかを確認するには、次のようにします。

int hasWand = (myInventoryBitmask & MagicWand);
if (hasWand > 0) {
  printf("I have a wand\n");
} else {
  printf("I don't have a wand\n");
}

それを得る?

編集:その他のもの

また、"bitshift" 演算子 << と >> にも出くわします。これは単に、「すべてを n ビット左にシフトする」または「すべてを n ビット右にシフトする」という意味です。

言い換えると:

1 << 3= 0001 << 3= 0001000= 8

と:

8 >> 2= 01000 >> 2= 010= 2

于 2010-08-06T20:40:15.057 に答える
2

「ビット」は「2 進数」の略です。はい、それは 0 または 1 です。ほとんどの場合、1 バイトには 8 があり、それらは 10 進数のように、左側に最上位の桁、右側に最下位の桁が表示されます。

あなたの例でw1 & 3は、バイナリの 3 は 00000011 であるため、最下位 (右端) 2 桁を除くすべてをマスクします。(2 + 1) AND 演算は、AND 演算されるビットのいずれかが 0 の場合、0 を返すため、最後の 2 ビットを除くすべてが自動的に 0。

于 2010-08-06T20:41:12.473 に答える
1

@ cHao&all:いいえ!ビットは数字ではありません。それらは0でも1でもありません!

まあ、0と1は可能で有効な解釈です。ゼロと1が典型的な解釈です。

しかし、ビットは単なるものであり、単純な代替手段を表しています。「そうです」または「そうではない」と書かれています。それ自体、「それ」については何も述べていません。それが何であるかはわかりません。

ほとんどの場合、これは気になりません。通常のように(またはプログラミング言語、CPU、その他のハードウェアの組み合わせ、「典型的」であることがわかっている)数字(または数字の一部、数字)としてそれらを使用できます。おそらく、問題が発生することはありません。彼ら。

ただし、「0」と「1」の意味を入れ替えても大きな問題はありません。わかりました。アセンブラのプログラミング中にこれを行うと、一部のニーモニックが他のロジックを実行し、名前、数字が否定されるなどのことを通知するため、少し問題があります。

必要に応じて、 http: //webdocs.cs.ualberta.ca/~amaral/courses/329/webslides/Topic2-DeMorganLaws/sld017.htmをご覧ください。

ご挨拶

于 2010-08-07T18:58:28.263 に答える
1
w1 =    ????...??ab
3  =    0000...0011
--------------------
&  =    0000...00ab

0 & 任意のビット N = 0

1 & 任意のビット N = N

したがって、ビットごとに 3 で AND 処理されたものはすべて、最後の 2 つのビットを除くすべてのビットが 0 に設定されます。最後の 2 つのビット (この場合は a と b) は保持されます。

于 2010-08-06T20:48:55.163 に答える