ASCII碼佔1字節(8位),第7位(bit 6)為數據位,第8位(bit 7)作為奇偶校驗位。已知:
| 字符 | 十進制 | 二進制 (8位) | 數據位 (bit0-6) | 1的個數 |
|---|---|---|---|---|
| '8' | 56 | 0011 1000 | 011 1000 | 4 (偶數) |
| 'B' | 66 | 0100 0010 | 100 0010 | 2 (偶數) |
含校驗位在內,'1'的總個數為奇數。
// 定義A:整個字節(含校驗位)奇校驗
// '8' 數據位4個1 → 校驗位=1 → 0011 1000 | 1 = 0111 1000 (0x78)
// 定義B:僅數據位奇校驗,校驗位不參與
// '8' 數據位4個1(偶數) → 校驗位=1 使數據位+校驗位為奇數
// 'B' 數據位2個1(偶數) → 校驗位=1
// 定義C:校驗位使「整個傳輸幀」奇校驗(含起始/停止位)
// UART常用:數據位+校驗位 奇/偶校驗
題目結果:'8'奇校驗=0,'B'奇校驗=1
'8' ASCII = 0x38 = 0011 1000
數據位(bit0-6) = 011 1000 → 4個1 (偶數)
若校驗位(bit7)=0 → 整字節 = 0011 1000 → 4個1 (偶數) → 偶校驗 ✅
若校驗位(bit7)=1 → 整字節 = 1011 1000 → 5個1 (奇數) → 奇校驗
'B' ASCII = 0x42 = 0100 0010
數據位 = 100 0010 → 2個1 (偶數)
若校驗位=0 → 0100 0010 → 2個1 (偶校驗)
若校驗位=1 → 1100 0010 → 3個1 (奇校驗) ✅
結論:題目所謂「奇校驗」實為「整字節奇校驗」,但'8'給出的0與此矛盾。
可能原因:教材將'8'的ASCII碼誤記為0x30(48)即'0'?
'0' = 0011 0000 → 數據位2個1 → 奇校驗位=1 → 1011 0000
uint8_t calcParity(uint8_t data, bool odd) {
uint8_t cnt = __builtin_popcount(data & 0x7F); // 僅數據位
return odd ? (cnt % 2 == 0) : (cnt % 2 != 0);
}
UART_PARITY_ODD/EVEN即可