[C言語] Cパズルブック 1.4.8-10 ビット演算子 シフト演算子 <<, >>

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

問1.4.8から1.4.10の解法は以下の通りです。

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

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

    // 問1.4.8
    x <<= 3;
    PRINT(x);   // 8

    // 計算1: x <<= 3
    // x = 0b00000001
    // <<3 
    // --------------
    //     0b00001000 

    // よって10進数8となる

    // 問1.4.9
    y <<= 3;
    PRINT(y);   // -8

    // 計算1: y <<= 3
    // y = 0b11111111
    // <<3 
    // --------------
    //     0b11111000(負数)
    // 反転 0b00000111 + 1 = 0b00001000 = 10進数8
    // マイナスを付けて-8

    // 問1.4.10
    // y = -8 // 問1.4.9の続き
    y >>= 3;
    PRINT(y);   // -1

    // 計算1: y >>= 3
    // y = 0b11111000
    // >>3 : 2^3 = 8で割るため-1になる
    // 古い計算機では符号を保存しないこともあり、8割る8で1になる場合がある

    // 別解
    // 計算1: y >>= 3
    // y = 0b11111000
    // >>3
    // ---------------
    // y = 0b11111111 3桁右シフトして左桁は1を追加
    // 反転 0b00000000 +1 = 0b00000001 = 10進数1
    // マイナスを付けて10進数-1

    return 0;
}
8
-8
-1