首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

CSAPP 2.12 習題解析:位運算提取與修改最低有效字節

     編輯:關於C語言

CSAPP 2.12 習題解析

題目要求:編寫 C 表達式對變量 x 的最低有效字節 (LSB) 進行操作,代碼需對任意字長 w ≥ 8 工作。參考:x = 0x87654321,w = 32。

核心掩碼

0xFF (二進制 0000...11111111) 專門針對最低 8 位(一個字節)。因 C 整數提升規則,0xFF 會自動擴展為 int 類型(符號擴展為 0),高位全 0,低 8 位全 1,完美適配任意字長。

三個子題解答

A. 取最低有效字節,其他位清 0

表達式:x & 0xFF

原理:按位與。0xFF 低 8 位為 1 保留原值,高位為 0 強制清零。

示例:0x87654321 & 0xFF = 0x00000021

B. 最高位取反,最低字節保持不變

表達式:~(x ^ 0xFF) 或 (~x) ^ 0xFF

原理推導:

  1. 目標:高位取反 (即 ~x 的高位),低位保持 x 原值。
  2. x ^ 0xFF:低 8 位翻轉,高位不變。
  3. ~(x ^ 0xFF):整體取反 → 低 8 位再次翻轉回原值,高位取反。完美達標。
  4. 等價變形:~(x ^ 0xFF) = (~x) ^ 0xFF (德摩根律/異或結合性)。

示例:x=0x87654321 → ~x=0x789ABCDE → (~x) ^ 0xFF = 0x789ABC21。高位 0x789ABC 為 ~0x876543,低位 0x21 保持。

C. 將最低有效字節設置為全 1,其他字節不變

表達式:x | 0xFF

原理:按位或。0xFF 低 8 位為 1 強制置 1,高位為 0 保留原值。

示例:0x87654321 | 0xFF = 0x876543FF

總結表

操作目標表達式核心運算掩碼作用
保留 LSB,其餘清 0x & 0xFFAND低 8 位 1 保留,高位 0 清零
高位取反,LSB 不變~(x ^ 0xFF)XOR + NOT利用雙重翻轉保護 LSB
LSB 置全 1,其餘不變x | 0xFFOR低 8 位 1 強制置 1,高位 0 保留

避坑指南

  • 不要寫死 0x000000FF,假設 32 位。用 0xFF 利用整數提升自動適配 16/32/64 位。
  • 注意 ~0xFF 在 16 位機上是 0xFF00,32 位上是 0xFFFFFF00,但本題三個表達式均不直接使用 ~0xFF,避免了字長依賴。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved