1

私はビットがオンであるかどうかを決定する次の関数を理解しようとしています:

int isBitISet( char ch, int i )
{
   char mask = 1 << i ;
   return mask & ch ;
}

まず、なぜ私は文字を取得するのですか?forch=abcdefghi=5関数は、右から5番目のビット(?)を返すことを想定していますd。だから、、 mask=00000001<<5=00100000そして00100000 & abcdefgh = 00c00000

なぜ私たちがcharを取得し、キャストなしでこれらすべてのシフトを実行できるのか説明していただけますか?なぜ5番目のビットを取得できなかったのでしょうか。また、ビットがオンであるかどうかに関係なく、戻り値が実際に表示であるのはなぜですか。

編集:「abcdefg」はビットの単なる記号であり、char型で文字列を表すことを意味するものではありませんでした。

以前はcharを'a'実際の8ビットではなく、と考えていたので、おそらくこれが私の最初の質問に対する答えです。

4

6 に答える 6

2

それはあなたに5番目のビットを与えません。2進数は20から始まるため、最初のビットは実際には。ではなく、でインデックス付けさ0ます1。代わりに6番目のビットを返します。

例:

ch & (1 << 0); // first bit
ch & (1 << 1); // second bit
ch & ((1 << 3) | (1 << 2)); // third and fourth bit.

また、charは数値の解釈にすぎません。ほとんどのマシンでは、サイズは8ビットであり、符号なしの値(0〜255)または符号付きの値(-128〜127)として解釈できます。つまり、基本的には範囲が非常に限られた整数であるため、キャストせずにビットシフトを適用できます。

また、指定されたビットが設定されていない場合にのみ、関数はゼロに等しい整数値を返します。それ以外の場合は、ゼロ以外の値です。

于 2012-07-16T08:29:58.000 に答える
1

コンピュータでは、すべてが0で始まることを知っておく必要があります。つまり、ビット番号5は実際には6番目のビットです(5番目ではありません)。

abcdefghあなたの分析は実際には正しいです、あなたがそれを与えれば5、あなたは得ます00c00000

あなたが「そして」をするとき:

return mask & ch;

maskintを持っているので、 (他の多くの演算子と同じように)ch自動的にキャストされます。intそのため、明示的なキャストは必要ありません。

最後に、この関数の結果は0..0z0..0の形式になります。、チェックしているビットが0の場合z、この値は0であり、が関係している限りはfalseifです。ゼロでない場合は、。に当てはまりますif

于 2012-07-16T08:32:38.297 に答える
1

関数が処理する入力もcharのみであるため、関数はcharを返す場合があります。確かにch=abcdefghを渡すことはできません。これは、8文字の文字列になるためです。

于 2012-07-16T08:26:54.110 に答える
1

Cで許可されているため、charでシフトを実行できます。charは8ビット整数型なので、禁止する必要はありません。

文字a、bなどが数値のバイナリ表現のビットである場合にisBitISet(abcdefgh, 5)返されるという事実については正しいです。00c00000戻り値はではなくthe fifth bit from the right、入力と同じ数値ですが、5番目のビットを除くすべてのビットがゼロになっています。cまた、ビットの番号付けはゼロから始まるため、ゼロ番目のビットがであるのと同じように、5番目のビットが正しいことを覚えておく必要がありhます。

この例では、整数型を使用してブール値を表します。boolCにはタイプがなかったため、これはC99より前のCコードでは一般的です。戻り値をブール値として扱う場合は、ゼロ以外のすべてが真であり、ゼロが偽であることを忘れないでください。したがって、の出力はisBitISet、ビットが設定されている場合はCに対して真でiあり、そうでない場合は偽です。

于 2012-07-16T08:32:05.067 に答える
0
  1. まず、この関数はi番目のビットを返しませんが、そのビットがオンかオフかを通知します。

  2. の使用法はchar maskここに依存する実装です。このマスクを適用する値はであるため、単純に8ビットマスクを定義しますchar

  3. 1チャーであるのになぜキャストが必要なのですか?i<<演算子の値のみです。

  4. ch=abcdefgh入力としては意味がありません。chはcharなので、ch1文字のみにすることができます。

  5. 動作は次のとおりです。最初に、不要なすべてのビットをゼロにするマスクを作成します。たとえば、入力がch = 204ch = 11001100)で、6番目のビットがオンかどうかを知りたい場合は、i=5mask = 1 << 5 = 00100000です。次に、このマスクがAND演算で値に適用されます。これにより、問題のビットを除くすべてがゼロになります11001100 & 00100000 = 00000000 = 0。Cでは0が偽であるため、6番目のビットは設定されません。同じch入力でi=6の別の例:mask = 1 << 6 = 01000000; 11001100 & 01000000 = 01000000 = 64、これは0ではないため、trueであるため、7番目のビットが設定されます。

于 2012-07-16T08:36:04.200 に答える
0

行う:

return 0 != (mask & ch) ;

ブール値(0x00000000または0x00000001)が必要な場合は、戻り値を返します。mask & ch一人であなたが正しい位置であなたが尋ねているビットをあなたに与えるでしょう。

(他の人は、i = 5が6番目のビットであることについて十分以上のことを言った)

于 2012-07-16T08:36:28.277 に答える