理论教育 C语言位运算实例-C语言程序设计

C语言位运算实例-C语言程序设计

更新时间:2025-01-03 理论教育 版权反馈
【摘要】:程序代码如下:程序运行结果:将num1和num2修改为short型之后,num1和num2是有符号变量,因此num2=~num1的值2是一个负数的补码,即num2存放的是负数。将num2转换为原码时,按照转换规则,得到二进制原码为10000000 00011000,即十进制的-24。unsigned short型数4113左移3位相当于乘以8。例2.14对于unsigned short型变量num1=10和num2=10,求num1|num2。程序代码如下:程序运行结果:在例2.9~例2.16中,运算量的数据类型是unsigned short或short,读者可以改用其他数据类型来练习位运算。

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,读者可以改用其他数据类型来练习位运算。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈