2016-10-17 51 views
0

特定のビットが反転している場所でプログラムを動作させようとしています。私はflipbit(int *p, int m)と呼ばれるこの機能を持っています。ユーザは数字とビット番号を入力する必要があります。たとえば、ユーザが数字800001000)とビット番号2を与えたとします。したがって、8の2番目のビットを反転して00001010にする必要があります。これをどのようにプログラムできますか?整数で特定のビットを反転する(C言語)

EDIT:私は愚かなミスをしました。0から数えたいので、反転した8の2番目のビットは実際には00001010の代わりに00001100です。

#include <stdio.h> 
#include <stdlib.h> 

void flipbit(int *p, int m) { 
    int digit; 
    digit = *p; 

    int bit; 
    bit = &m; 

    int result; 

    //printf("The numbers are %d %d", digit, bit); 

    printf("%d", result); 
} 

int main() { 
    int number1; 
    int number2; 

    printf("Give number and bit: "); 
    scanf("%d, %d",&number1, &number2); 

    flipbit(&number1, &number2); 

    return 0; 
} 
+1

この質問には、参考になる回答があります:http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-cc –

+0

ここにヒントがあります:コードを開発するときは、常に警告を有効にしてコンパイルしてください(たとえば、 '-Wall -pedantic'をコマンドラインオプションに追加してください)。そうすることで、関数の2番目の引数が正しく処理されなかったことが警告されてしまいます。 –

+0

コードを変更しないでください。それは既存の回答を無効にします。 – dbush

答えて

0

ソースコードをチェックすると、ポインタと値が混在しています。宣言であなたのflipbit()関数の呼び出しを遵守するために 、呼び出しは次のようになります。数字が値であり、pはポインタであるため、

// first parameter is a pointer and second parameter is a value 
flipbit(&number1, number2); // void flipbit(int *p, int m); 

flipbit()関数の内部では、混合物を続けています。 「ビット」パラメータ

int bit; 

// 'bit' is a value and 'm' is a value 
bit = m; 

とエラーの

int digit; 

// 'digit' is a value and 'p' is a pointer 
digit = p[0]; // 'digit' is the first value pointed by 'p' 

同じエラーの種類とビットを反転する結果はXOR演算である:コードがなければなりません。

ビット数2、そのため、あなたの仕様に第二

は、あなただけの移動しなければならない(ビット - 1)。 だから、あなたの場合: は0x0001(または0000.0000.0000.0001b)< <(2 - 1)= 0×0002(または0000.0000.0000.0010b)

結果である0x0010(または0000.0000.0000.1000b)のXOR 0×0002(または0000.0000.0000.0010b)= 0x0012(または0000.0000.0001.0010b)。

int result; 

result = digit^(0x0001 << (bit - 1)); 

は、あなたが入力したのscanf( "%d個、%dの"、...)を遵守する '1、9' をしましたか?

+0

なぜビットに-1のinfrontがありますか? – Teuntje

+0

編集をありがとう、私はプログラムを実行しようとしています。私は入力11を与えなければなりませんが、それは出力11を与えるはずですが、それは出力8を与えます。私は間違っていますか?私はコードを更新しました。 – Teuntje

+0

'result = digit ^(1 <<(ビット));'、 'ビット番号は8ビットの範囲で7 .. 0でなければなりません。 – FloppySoftware

3

ビットを反転すると、まずマスクを作成する必要があります。値1を取り、それをビット番号だけシフトして左に移動します。

マスクを作成したら、bitwise XOR演算子^を使用してビットを反転します。

int mask = 1 << m; 
*p = *p^mask; 
+0

あなたの答えに感謝しますが、それは数字=数字^マスク; – Teuntje

+2

@Teuntje呼び出し元の関数から結果を表示する必要はありません。 – dbush

+0

よりコンパクトな形式は 'value^=(1 << bit_number);です。 –

関連する問題