深 入 理 解 计 算 机 系 统 (第 二 版 ) 家 庭 作 业 第 二 章 深入理解计算机系统二进制 2.55-2.57 略 2.58 int is_little_endian(){ int a = 1; return *((char*)&a); } 2.59 (x&0xFF) | (y&~0xFF) 2.60 unsigned replace_byte(unsigned x, unsigned char b, int i) { return (x & ~(0xFF<<(i<<3))) | (b << (i<<3)); } 2.61 A. !~x B. !x C. !~(x>>((sizeof(int)-1)<<3)) D. !(x&0xFF) 注 意 , 英 文 版 中 C 是 最 低 字 节 , D 是 最 高 字 节 。中 文 版 恰好反过来了。这里是 按中 文 版 来做的。 2.62 这里我感觉应该是 英 文 版 对的, int_shifts_are_arithmetic() int int_shifts_are_arithmetic(){ int x = -1; return (x>>1) == -1; } 2.63 对 于 sra, 主 要 的 工 作 是 将 xrsl 的 第 w-k-1 位 扩 展 到 前 面 的 高 位 。 这个可以利用取反加 1 来实现, 不过这里的 加 1 是 加 1<<(w-k-1)。 如果 x 的 第 w-k-1 位 为 0, 取反加 1 后, 前 面 位 全为 0, 如果为 1, 取反加 1 后就全是1。 最后再使用相应的 掩码得到 结果。 对 于 srl, 注意工 作 就是 将 前 面 的 高 位 清 0, 即 xsra & (1<<(w-k) - 1)。额外注意k==0 时, 不能使用 1<<(w-k), 于 是 改用 2<<(w-k-1)。 int sra(int x, int k){ int xsrl = (unsigned) x >> k; int w = sizeof(int) << 3; unsigned z = 1 << (w-k-1); unsigned mask = z - 1; unsigned right = mask & xsrl; unsigned left = ~mask & (~(z&xsrl) + z); return left | right; } int srl(unsigned x, int k){ int xsra = (int) x >> k; int w = sizeof(int)*8; unsigned z = 2 << (w-k-1); return (z - 1) & xsra; } 2.64 int any_even_one(unsigned x){ return !!(x & (0x55555555)); } 2.65 int even_ones(unsigned x){ x ^= (x >> 16); x ^= (x >> 8); x ^= (x >> 4); x ^= (x >> 2); x ^= (x >> 1); return !(x&1); } x 的 每 个 位 进 行 异 或 , 如 果 为 0 就 说 明 是 偶 数 个 1, 如 果 为 1 就 是 奇 数 ...