百度首页 | 百度空间
 
查看文章
 
位运算
2008/02/22 10:38

位运算

一、位运算概述

位运算的特点:运算按二进制逐位进行——没有借位和进位。

运算量——整型/字符型(以补码/ASCII码形式存储),不可为实型。

运算符——8.1

二、位运算符的使用

注意:位运算时的数据类型为char/int,分析时要化为二进制形式,但在程序中书写及输出结果时仍为char/int

1、按位与 & (均为1时方为1

例一

main( )

{ unsigned char a,b;

printf(“Enter a and b:”);

scanf(“%o,%o”,&a,&b);

printf(“a&b=%o\n”,a&b);

}

00010000 (a)

     &   00011000 (b)  

00010000  

00001010 (a)

   &   00010000 (b)  

00000000

运行情况: Enter a and b: 20,30

             a&b=20

Enter a and b: 12,20

             a&b=0

常用:测试数b的第i 位是否为1

           设计一数a,让其仅第 i 位为1,然后a&b,如果仍为a,则b的第i 位为1

屏蔽(保留)数b的某几位。

           设计一数a,让其仅某几位为0(屏蔽)或为1(保留),然后 b=a&bb&=a

2、按位或 | (均为0时方为0

常用:使数b的特定位i 1

        设计一数a,让其仅第 i 位为1,然后b=a|b ( b | =a)

3、按位异或 ^ (二者相异方为1

例二】以下程序的功能是将a数据的低4位取反。

#include <stdio.h>

main()

{unsigned char a=0x39, b= 2 ;

a=a^b;

printf("%d\n", a);

}

        答案:0x0f

常用:使数b的特定位i 翻转

设计一数a,让其仅第 i 位为1,然后b=a^b ( b ^ =a)

4、按位取反 ~ (各位反转)

【例二】main( )

{ char a=3;

int b=3;

printf("a=%d,b=%d\n",a,b);

}

结果:~a=-4,~b=-4

注意:~的优先级很高,对~a&b,是先进行~a运算,再进行&运算。

5、左移运算 <<

a<<n a中各位向左移n位,右端补0,高位溢出丢弃。

例:a= a<<n (可写为a<<=n),相当于a×2n(高位未溢出时)

例三】以下程序的运行结果是      

main()

{ unsigned int a=0x3ef,b;

b=a<<2;

printf("%x,%x\n",a,b);

}

A) A 3ef,fb    B) 3ef,fbc    C) fbc,3ef   D) fbc,fbc

答案:B

6、右移运算 >>

a>>n a中各位右移n位,溢出则舍弃。左端——

·a为正数时(符号位为0),填0

·a为负数时(符号位为1),填0或填1与系统有关

      0(逻辑右移)

      1(算术右移) TC使用算术右移

例四main()

{ int a=9,b=-9;

printf("%d,%d",a>>2,b>>2);

}

         结果:2-3 -9的补码 1111111111110111,右移的为1111111111111101)。

【注意】不同长度两数(如long ylong x)位运算时,应右端对齐。较短者左端——

           ·填0(正数和无符号数)

           ·填1(负数)


类别:c/c++ | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu