2011-12-26 12 views
4

私の質問は簡単ですが、私は簡単な解決策を見つけることができません: 私はより大きいまたはeqal 16、したがって少なくとも1000バイナリです。ビットごとのNOT演算子を使用して3番目のビットを反転したいと思います。この場合、1100となります。C:Bitwise NOT on特定のビット

これを行う演算子はありますか? ~オペレータは、私が知っている限り、すべてのビットを1つだけ確実に反転させます。

+0

宿題の場合は、そのまま宿題にしてください。 –

+0

申し訳ありませんが、これは宿題ではなく、ちょうど純粋な好奇心 –

答えて

10

フリップしたいビットとXORします。

int c = 0x10; // 10000b 
int m = 0x08; // 01000b 
c ^= m;  // 11000b 
+0

実際には、 '0x08 == 01000b'です。 –

+0

+1古典的な「ブール代数101」のソリューション。 –

+0

@larsmansありがとう!私は3つすべての最後のゼロを「落とした」。これは修正されました。 – dasblinkenlight

2

チェックこのサイト:http://www.daniweb.com/software-development/c/threads/41493 彼はあなたが持っている同じ問題、および解決策のカップルを持っています!

void flipbit(unsigned* a, unsigned b) 
{ 
    *a ^= (1 << b); 
} 
+0

いくつかのランダムなフォーラムへのリンクは良いStackOverflowの答えを構成していません... –

4

bit_fldが3ビットのためのビットフィールドであり、n = 3

bit_fld ^= (1 << n) 

を行います。

3

「フリップ」と呼ばれるものは、実際にはXORと呼ばれています。サイドノートで

int sixteen = 16; // 10000 
int twentyfour = sixteen^0x8; // flip the 4th bit. result: 24 
int sixteen_again = twentyfour^0x8; // again, flip the 4th bit. result: 16 

:バイナリ16は10000ではなく、1000

1
#include <stdio.h> 

int main(void) 
{ 
    int x = 0xFFFFFFFF; 
    int n = 0; 
    int y, i; 

    for (i=0 ; i < (int)sizeof(int)*8 ; i++) { 
     y = x^~(1<<i); 
     printf("x=%x\ti=%d\ty=%x\n", x, i, y); 
    } 

    x = 0x0; 
    for (i=0 ; i < (int)sizeof(int)*8 ; i++) { 
     y = x^~(1<<i); 
     printf("x=%x\ti=%d\ty=%x\n", x, i, y); 
    } 
    return 0; 
} 

/* 
Output: 
x=ffffffff i=0 y=1 
x=ffffffff i=1 y=2 
x=ffffffff i=2 y=4 
x=ffffffff i=3 y=8 
x=ffffffff i=4 y=10 
x=ffffffff i=5 y=20 
x=ffffffff i=6 y=40 
x=ffffffff i=7 y=80 
x=ffffffff i=8 y=100 
x=ffffffff i=9 y=200 
x=ffffffff i=10 y=400 
x=ffffffff i=11 y=800 
x=ffffffff i=12 y=1000 
x=ffffffff i=13 y=2000 
x=ffffffff i=14 y=4000 
x=ffffffff i=15 y=8000 
x=ffffffff i=16 y=10000 
x=ffffffff i=17 y=20000 
x=ffffffff i=18 y=40000 
x=ffffffff i=19 y=80000 
x=ffffffff i=20 y=100000 
x=ffffffff i=21 y=200000 
x=ffffffff i=22 y=400000 
x=ffffffff i=23 y=800000 
x=ffffffff i=24 y=1000000 
x=ffffffff i=25 y=2000000 
x=ffffffff i=26 y=4000000 
x=ffffffff i=27 y=8000000 
x=ffffffff i=28 y=10000000 
x=ffffffff i=29 y=20000000 
x=ffffffff i=30 y=40000000 
x=ffffffff i=31 y=80000000 
x=0 i=0 y=fffffffe 
x=0 i=1 y=fffffffd 
x=0 i=2 y=fffffffb 
x=0 i=3 y=fffffff7 
x=0 i=4 y=ffffffef 
x=0 i=5 y=ffffffdf 
x=0 i=6 y=ffffffbf 
x=0 i=7 y=ffffff7f 
x=0 i=8 y=fffffeff 
x=0 i=9 y=fffffdff 
x=0 i=10 y=fffffbff 
x=0 i=11 y=fffff7ff 
x=0 i=12 y=ffffefff 
x=0 i=13 y=ffffdfff 
x=0 i=14 y=ffffbfff 
x=0 i=15 y=ffff7fff 
x=0 i=16 y=fffeffff 
x=0 i=17 y=fffdffff 
x=0 i=18 y=fffbffff 
x=0 i=19 y=fff7ffff 
x=0 i=20 y=ffefffff 
x=0 i=21 y=ffdfffff 
x=0 i=22 y=ffbfffff 
x=0 i=23 y=ff7fffff 
x=0 i=24 y=feffffff 
x=0 i=25 y=fdffffff 
x=0 i=26 y=fbffffff 
x=0 i=27 y=f7ffffff 
x=0 i=28 y=efffffff 
x=0 i=29 y=dfffffff 
x=0 i=30 y=bfffffff 
x=0 i=31 y=7fffffff 
*/ 

Iはcにビット操作のためthisリンク参照Cに XOR(++)は、次のように動作します。

+0

これはビットを反転されません。 –

+0

私に注目してくれてありがとう!私は間違いを訂正しました!私が間違ったときはいつでも私を修正してください! :) –

関連する問題