BBS水木清华站∶精华区

发信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信区: test 
标  题: 星星流讲座 0007 
发信站: ☆清华电机☆ (Thu May  4 18:11:15 1995) 
 
 
第 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),它们的运算元有两个。 
 
-- 
本文原作者为徐振家,原作刊载於星星神教总坛 ☆清华电机☆ test 板。 
你可以以电子文件的形式将本文自由流传於台湾学术网路,但必须包含此版权声明。 
原作者依中华民国著作权法之规定,享有本文之著作权,请勿抄袭以免触法。 
未经授权任何人不得以任何形式对本文做任何修改及商业上之应用。 
其他网路的转载或其他用途的应用,请先知会作者,并取得其同意。 
对本文有任何疑问或意见请 mail 给 ax.bbs@bbs.ee.nthu.edu.tw,谢谢。 
 
 

BBS水木清华站∶精华区