『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