1

if元のビットを変更せずに演算子に基づいてステートメントを入力しようとしてbit-wiseいますが、なぜ機能しないのか混乱しています。

ビット 7、4、2 の少なくとも 1 つが 0かどうかを確認しています。

作業コード:(元のビットを変更しますが、これは望ましくありません)

#include <stdio.h>

void main() {

    unsigned char ch = 0b11111111;

    ch = ~(ch | 0x6B);

    if(ch) {

        printf("%s\n", "YES");
    } 

    else {           

        printf("%s\n", "NO");        
    }

}

ビット7、4、または 2 を 0 にNO変更すると、(本来あるべきように) 印刷され、印刷されます。YES

動かないコード:

#include <stdio.h>

void main() {

    unsigned char ch = 0b11111111;

    if(~(ch | 0x6B)) {

        printf("%s\n", "YES");
    } 
    else {

        printf("%s\n", "NO");
    }

}

2 つのコードが同一だと思うので、かなり困惑しています。ありがとう!

4

2 に答える 2

3

それは簡単に説明できます:

0x6Bあなたが書くと、デフォルトの整数(おそらく32ビット)として解釈されます。だから(ch|0x6B)== 0x000000FF==0b00000000000000000000000011111111。したがって、~(ch|0x6B) == 0b11111111111111111111111100000000は 0 ではないため、 は ですtrue

ただし、その結果を に入れるとchar、下位 8 ビットのみが保存されるため(unsigned char) ~(ch|0x6B) == 0、 と評価されfalseます。

于 2015-06-07T18:00:27.250 に答える
0

最初の例では、計算の ms ビットが切り捨てられた後、文字値をテストしています。

2 番目の例0x6Bは整数であるchため、計算のために int に昇格され、msbits (反転したもの) がテストで考慮されます。

ビット 7、4、2、0 のいずれかが設定されているかどうかをテストする、より簡単な (そしてより明白な) 方法があります。

if ((ch & 0x95) != 0) { ... }
于 2015-06-07T18:06:16.793 に答える