1.按位取反运算
按位取反运算符~是一个单目运算符,运算量在运算符之后,取反运算的功能是将一个数据中的所有位都取其相反值,0变1,1变0。
例2.9 对于unsigned short型变量num1=(23)10,求~num1。
【分析】由于(23)10=(00000000 00010111)2,因此对于unsigned short型变量num2=~num1,num2的值为(11111111 11101000)2=(177750)8=(65512)10。
程序代码如下:
运行程序输出如下:
将该程序中的num1和num2改为short型,看看运行结果如何?程序代码如下:
程序运行结果:
将num1和num2修改为short型之后,num1和num2是有符号变量,因此num2=~num1的值(11111111 11101000)2是一个负数的补码,即num2存放的是负数。将num2转换为原码时,按照转换规则,得到二进制原码为10000000 00011000,即十进制的-24。
2.左移运算
左移运算符<<是一个双目运算符,左移运算的功能是将一个数据的所有位向左移若干位,将左边(高位)移出的部分舍去,将右边(低位)自动补零。
例2.10 对于unsigned short型变量num1=(4113)10,求num1<<3的结果。
【分析】由于num1的二进制形式为(00010000 00010001)2,因此num1<<3的结果是(10000000 10001000)2,换算成十进制为32904。
程序代码如下:
程序运行结果:
将该程序修改如下:
程序运行结果:
原因与例2.9相同,num1<<3结果是(10000000 10001000)2,这是一个负数的补码,按照转换规则,得到它的二进制原码为11111111 01111000,因此按十进制%d格式输出short型数是-32632。
对于无符号数来说,在左移的过程中如果没有高位的丢失,则左移1位相当于乘以2,左移2位相当于乘以4。unsigned short型数4113左移3位相当于乘以8。
因为左移运算速度较快,因此,对于乘2的操作,有些C编译系统自动用左移1位来实现,将2n幂运算用左移n位来实现。
3.右移运算
右移运算符>>是双目运算符,右移运算的功能是将一个数据的所有位向右移若干位。将右侧(低位)移出的部分舍去,左侧(高位)移入的二进制数分两种情况处理:对于无符号数和正整数,高位补0;对于负整数,高位补1(适用于Visual C++和C-Free及Turbo C等系统)。
例2.11 对于unsigned short型变量num1=(783)10,求num1>>3的结果。
【分析】由于(783)10的二进制形式为(00000011 00001111)2,因此num1>>3的结果是(00000000 01100001)2=(97)10。
程序代码如下:
程序运行结果:
对于无符号数来说,在右移过程中,如果没有低位的丢失,则每右移1位,就相当于除以2,右移2位相当于除以4。
4.按位与运算(www.daowen.com)
按位与运算要求有两个运算量,按照运算规则,将两个运算量的各对应二进制位作按位与运算。
例2.12 对于unsigned short型变量num1=(32813)10和num2=(32815)10,求num1&num2。
【分析】由于(32813)10=(10000000 00101101)2,(32815)10=(10000000 00101111)2,因此num1&num2=(10000000 00101101)2=(32813)10。
程序代码如下:
程序运行结果:
例2.13 对于short型变量num1=(-83)10和num2=(-53)10,求num1&num2。
【分析】由于(-83)10的补码为(11111111 10101101)2,(-53)10的补码为(11111111 11001011)2,因此num1&num2=(11111111 10001001)2(11111111 10001001)2是(-119)10的补码。
程序代码如下:
程序运行结果:
5.按位或运算
按位或运算符要求有两个运算量,按照运算规则,将两个运算量的各个对应二进制位作按位或运算。
例2.14 对于unsigned short型变量num1=(32815)10和num2=(32813)10,求num1|num2。
【分析】由于(32815)10=(10000000 00101111)2,(32813)10=(10000000 00101101)2,因此num1|num2=(10000000 00101111)2=(32815)10。
程序代码如下:
程序运行结果:
例2.15 对于short型变量num1=(-63)10和num2=(-53)10,求num1|num2。
【分析】由于(-63)10的补码为(11111111 11000001)2,(-53)10的补码为(11111111 11001011)2,则num1|num2=(11111111 11001011)2,(11111111 11001011)2是(-53)10的补码。
程序代码如下:
程序运行结果:
-63和-53按位或运算的结果是-53
6.按位异或运算
按位异或运算符要求有两个运算量,按照运算规则,将两个运算量的各对应二进制位作按位异或运算。
例2.16 对于unsigned short型变量num1=(32815)10和num2=(32813)10,求num1^num2。
【分析】由于(32815)10=(10000000 00101111)2,(32813)10=(10000000 00101101)2,因此num1^num2=(00000000 00000010)2,(00000000 00000010)2=(2)10。
程序代码如下:
程序运行结果:
在例2.9~例2.16中,运算量的数据类型是unsigned short或short,读者可以改用其他数据类型来练习位运算。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。