阿摩線上測驗 登入

申論題資訊

試卷:98年 - 98 高等考試_三級_資訊處理:程式語言#34599
科目:程式語言
年份:98年
排序:0

申論題內容

五、考慮 C 程式語言的位元運算(bitwise operation),變數 m 和陣列(array)n 的宣告
如下:
unsigned int m;
unsigned char n[4];
假設 m 的二進位值(binary value)為:
b32b31b30b29b28b27b26b25b24b23b22b21b20b19b18b17b16b15b14b13b12b11b10b9b8b7b6b5b4b3b2b1
寫一個 C 語言的程式將陣列 n 的元素(element)設定為:
n[0]: b31b32b29b30b27b28b25b26
n[1]: b23b24b21b22b19b20b17b18
n[2]: b15b16b13b14b11b12b9b10
n[3]: b7b8b5b6b3b4b1b2
即是將 m 的二進位值,以每兩個位元一組,作位元調換(bit swap),再切割成四個
位元組。除了迴圈控制變數(loop control variable)外,程式中不可使用+, -, *, /, %的
算術運算(arithmetic operations)(可以宣告和使用其他變數)。(20 分)

詳解 (共 1 筆)

詳解 提供者:hchungw
#include <stdio.h>
int main() {
    unsigned int m = 0b11001100101010101100110010101010; // 示例數據
    unsigned char n[4];
    
    // 位元調換函數
    unsigned char swap_bits(unsigned char byte) {
        unsigned char swapped = 0;
        swapped |= (byte & 0x80) >> 1; // b7 -> b6
        swapped |= (byte & 0x40) << 1; // b6 -> b7
        swapped |= (byte & 0x20) >> 1; // b5 -> b4
        swapped |= (byte & 0x10) << 1; // b4 -> b5
        swapped |= (byte & 0x08) >> 1; // b3 -> b2
        swapped |= (byte & 0x04) << 1; // b2 -> b3
        swapped |= (byte & 0x02) >> 1; // b1 -> b0
        swapped |= (byte & 0x01) << 1; // b0 -> b1
        return swapped;
    }
    // 提取 m 的各個位元組並調換位元
    n[0] = swap_bits((m >> 24) & 0xFF);
    n[1] = swap_bits((m >> 16) & 0xFF);
    n[2] = swap_bits((m >>  8) & 0xFF);
    n[3] = swap_bits((m >>  0) & 0xFF);
    // 輸出結果
    for(int i = 0; i < 4; i++) {
        printf("n[%d]: %02X\n", i, n[i]);
    }
    return 0;
}
解釋
位元調換函數 swap_bits:
該函數接收一個8位元的位元組,並將其內部的兩兩位元進行交換。具體來說,它將 b7 和 b6 交換,b5 和 b4 交換,依此類推。
使用位元運算符 & 和 | 來提取和設定每一對位元的位置。
提取和處理 m 的位元組:
變數 m 的每個位元組是通過位移操作提取的。例如,(m >> 24) & 0xFF 提取最高的8位元。
提取後,每個位元組都通過 swap_bits 函數進行兩兩位元的交換。
輸出結果:
最後,將結果存入陣列 n 中,並通過循環輸出每個元素的值。
這樣的實現方法遵循了題目中禁止使用算術運算符(+, -, *, /, %),僅使用位移和位元運算符來達成目標。