發信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信區: test
標  題: 星星流講座 0007
發信站: ☆清華電機☆ (Thu May  4 18:11:15 1995)
轉信站: star

星星流講座 0007         C 語言教室

第 2 講 之 4            Arithmetic Operations
                        Topic: 位元邏輯運算

在 C 語言中,我們除了以十進位的方式表示數字之外,也可以用八進位和十六
進位的型式來表示數字。請看下面的範例程式:

/* octhex.c */

#include <stdio.h>

main ()
{
    int a, b;
    a = 064;
    b = 0x1a;
    printf ("%d %d\n", a, b);
}

執行結果:

52 26

C 語言中表示八進位數字的方法就是以 0 開頭的整數自動被視為八進位,同理,
以 0x 開頭的數自動被視為十六進位。只有整數可以被表示成八進位和十六進位
的型態
,也就是說,你不可以寫出像 a = 0x65.1 這種型式的東西。正負號則可
以像平常一樣加在數的前面。

由我們的例子中可以發現,printf 是以十進位顯示數字的。

C 語言提供了下面幾種運算子可供數值做位元邏輯運算:

        運算子  功能
       
        <<      左移 N bit (Shift Left N bit)
        >>      右移 N bit (Shift Right N bit, and keep sign bit)
        &       AND
        |       OR
        ~       取 1 補數 (1's complement)
        ^       XOR (Exclusive OR)

我們假設各位都能了解這些運算的意義 ^_^,下面是一個簡單的範例程式:

/* bool.c */

#include <stdio.h>

main ()
{
    unsigned short a, b;
    short d, e;

    d = 0xff;
    e = -0xff;
    a = 0xaa;
    b = 0xa1;

    printf ("%x %x %x\n", d << 1, e << 1, e >> 1);
    printf ("%x %x %x %x\n", a & b, a | b, a ^ b, ~a);
}

執行結果:

1fe fffffe02 ffffff80
a0 ab b ffffff55

程式中 d << 1 表示把 d 的值左移 1 bit。此外 printf 中我們使用 %x 這個引數
代替我們原來常用的 %d,這是為了把數字以十六進位顯示的緣故。各位可以嘗試著
把這個結果以二進位的方式列出來,你會發現 sign bit 是被保留著的。

C 語言對於位元運算的運算子,也提供了對應的指定運算子,列表如下:

        原來的運算式            比較簡潔的運算式

        a = a << 2              a <<= 2
        a = a >> 2              a >>= 2
        a = a & b               a &= b
        a = a | b               a |= b
        a = a ^ b               a ^= b

請注意並沒有 ~= 這個運算子。~ 是一個單元運算子 (unary operator),也就
是它的運算元 (operand) 只有一個,而其他我們所介紹過的運算子都是二元運算子
(binary operator),它們的運算元有兩個。