查看文章 |
位运算 一、位运算概述 位运算的特点:运算按二进制逐位进行——没有借位和进位。 运算量——整型/字符型(以补码/ASCII码形式存储),不可为实型。 运算符——表8.1
二、位运算符的使用 注意:位运算时的数据类型为char/int,分析时要化为二进制形式,但在程序中书写及输出结果时仍为char/int。 1、按位与 & (均为1时方为1)
运行情况: 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&b(b&=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 y和long x)位运算时,应右端对齐。较短者左端—— ·填0(正数和无符号数) ·填1(负数)
|