[C言語] Cパズルブック 1.4.6 ビット演算子 ビット反転演算子~

『Cパズルブック』(Alan R.Feuer, 1985)
[Mac M2 Pro 12CPU, MacOS Ventura 13.3.1, clang 14.0.3]

問1.4.6の解法は以下の通りです。符号付き整数型ですからビット番号7(右から8番目)は符号を表します。

計算3で少し手間取りました。

#include <stdio.h>
#define PRINT(int) printf("%d\n",int)

int main() {
    int x , y;
    
    x = 1; y = -1;

    // 問1.4.6
    PRINT( ~x | x);   // -1

    // ビット反転演算子~を優先
    PRINT(~x);        // -2
    PRINT( (~x) | x); // -1

    // 計算1: ~x
    // x = 0b00000001
    // ~ --------------
    //     0b11111110     

    // 計算2: (~x) | x
    // Lt = 0b11111110
    // x  = 0b00000001
    // | -------------
    //      0b11111111(符号付き -128から127まで)

    // 計算3:10進数へ変換
    // 0b11111111の最上位ビット(右から8番目)は1なので負数
    // 反転したビットに1を加える
    // 0b00000000 + 1 = 0b00000001 = 10進数1
    // 負数なのでマイナスを付けて10進数-1になる

    return 0;
}
-1
-2
-1