整数の特定のビットの設定を解除する方法

たとえば、 10101 のような整数があり、 10001 を取得するために3番目のビットを設定解除したいとします。 10001 がある場合でも、 10001 になります。どうすれば達成できますか?

unset(int i, int j)
int i= 10101 or 10000
int j = 00100
14
実際に使用しているプログラミング言語を教えてください。 (質問の「コード」は、あなたが質問のタグを付けたものでは無効です)。
追加された 著者 Stephen C,
あなたは言語についてあなたの心を作ってくれますか?
追加された 著者 R. Martinho Fernandes,

6 答え

右からビットをインデクシングしていると仮定すると、 value の特定のビットをアンセットする必要があります:

int mask = 1 << bitIndex;
value &= ~mask;

あなたは同様のコードを使用してビットを設定することができます:

value |= mask;

mask は以前と同じです。 (これはビットインデックスが0から始まると仮定しています)

40
追加された

ビットをクリアまたはアンセットするには

Use the bitwise AND operator (&) to clear a bit.

 number &= ~(1 << x); 

それはビットxをクリアします。ビット単位のNOT演算子(〜)を使用してビット列を反転し、次にそれをANDする必要があります。

注:ここでxは0からLSBまでのビットの位置です。

10
追加された

n番目のビットを切り替えることができます

result = number ^ (1 << bitIndex)

1
追加された
トグルがクリアされません。 OPはビットが既に0であれば0に留まることを望む。
追加された 著者 Ted Hopp,

あなたがlitteralsを扱っている場合、あなたはちょうど16進数で作業することができます。ビットパターンを16進数に変換する:

10101 => 0x15
00100 => 0x04

したがって、次のCコードでは、 b を目的の結果に設定します。

int a = 0x15;
int b = a & ~( 0x04 );

あなたが何か一般的なものを望むなら、あなたはCの関数を持つことができます。

int clearBit( int value, int bit )
{
   //Assume we count bits starting at 1
    return value & ~( 1 << (bit -1) );
}
1
追加された

Bitwise functions.

Javaの場合:

int num = 0b10101;
int mask = 1 << bitPosition;

System.out.println(Integer.toBinaryString(num));
num &= ~mask;
System.out.println(Integer.toBinaryString(num));
0
追加された
@EJPああ、これを入力して固定したのは遅かった。
追加された 著者 Jeffrey,
間違っています。あなたのコードは N = 3 のみで動作します。 N 番目のビットは、 N = 0 .. (1 << N)によって与えられます。 integerLength で行うことはありません。
追加された 著者 EJP,

CおよびC ++では、 ビット単位のAND演算子 を使用してANDマスクを作成します。

10101 & 10001
0
追加された
@QuinnTaylor:彼が解きたいと思っているビットを知っていて、具体的にはQの中でそう言います。私がコメントとdownvoteがちょうど騒々しい音です。
追加された 著者 Alok Save,
この「解決策」の問題は、OPが正確に計算しようとしているときにOPが既にマスク 10001 を形成していなければならないことです。 (私はOPの質問を、 i の実際の値を知らずに特定のビットをゼロにしたいという一般的な事例について質問しています。)
追加された 著者 Ted Hopp,
これは、事前にマスクを作成する必要があるため、任意のビットを設定解除する場合には役に立ちません。
追加された 著者 Quinn Taylor,