0

int から 1 ビットを取得するコードの一部を探しています。
それは次のとおりです。

private int getBit( int token, int pos){  
   return ( token & ( 1 << pos ) ) != 0 ? 1 : 0;   
}

私の質問は、なぜ次の(より簡単な)方法でそれをしないのですか?

return token & ( 1 << pos );   

0またはも返すと思い1ます。
私はこれで間違っていますか?2 番目の (私の) バージョンは間違っていますか?

4

4 に答える 4

3

お使いのバージョンは、位置posのビットの値を返しません。値0または2^(pos-1)を返します。

于 2012-05-22T20:29:52.623 に答える
2

あなたのバージョンは0またはを返します1<<pos

ブールコンテキストで使用されているかどうかは関係ありません。しかし、そうでないかもしれません。

于 2012-05-22T20:29:06.577 に答える
2

バージョンが間違っています。実行すると

return token & ( 1 << pos );

ゼロ以外の場合は、ビットを除くすべてのビットがゼロになった int を取得します。これは、演算子posの右側の数値であるためです。&の場合、これは明らかに 1 になりますpos==0

これは、&演算子が 2 つの s の対応するビット間で単純にビット単位の and 演算を実行するために発生しintます。最小値以外の位置にビットがあり、1 << posおそらく任意の になる可能性があるため、結果も最小値以外の位置にビットがあり、 よりも大きくなる可能性があります。1tokenint11

于 2012-05-22T20:31:44.360 に答える
2

もちろん、次の順序で何かを使用できます。

(token >> pos) & 1
于 2012-05-22T20:32:55.980 に答える