發信人: 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),它們的運算元有兩個。