欢迎来到天天文库
浏览记录
ID:37819071
大小:197.80 KB
页数:11页
时间:2019-05-31
《按位取反运算》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第9 章位运算在计算机内部,程序的运行、数据的存储及运算都是以二进制的形式进行的。位运算是指进行二进制位的运算,是C语言有别于其他高级语言的一种强大的运算,它使得C语言具有了某些低级语言的功能,主要用于系统程序或控制程序中,例如设备驱动程序、磁盘文件管理程序等。9.1 位运算符与位运算有些位运算可以作为关闭位的手段,屏蔽掉某些位,如奇偶校验位。有些位运算相反,可用来置位,直接对结果变量的每一位分别处理。移位运算可对外部设备(如D / A转换器)的输入和状态信息进行译码,移位运算还可用于整数的快速乘除运算。9.1.1 位运算符表 9.1 列出了位运算的运算符。位运算符的操作对象
2、为整型或字符型数据。下面一一列举说明。表9.1位运算符位运算符含义举例~按位取反~a,对变量a中全部二进制位取反<<左移a<<2,a中各位全部左移2位,右边补0>>右移a>>2,a中各位全部右移2位,左边补0&按位与a&b,a和b中各位按位进行“与”运算
3、按位或a
4、b,a和b中各位按位进行“或”运算^按位异或a^b,a和b中各位按位进行“异或”运算9.1.2 按位取反运算符按位取反运算符“~”是一个单目运算符,能对一个二进制数的每一位都取反,即0 变为 1,1 变为 0。例如:a=00011010/*十六进制为1a*/~a=11100101/*十六进制为e5*/9.1.3 左
5、移运算符左移运算符“<<”的功能是将一个数的各个二进制位全部向左平移若干位,左边移出的部分予以忽略,右边空出的位置补零。如:a=00011010/*十六进制为1a*/a<<2=01101000/*十六进制为68*/一个数据,每左移1 位相当于乘以 2,左移 2 位相当于乘以 4,以此类推。9.1.4 右移运算符与左移相反,右移运算符“>>”的功能是将一个数的各个二进制位全部向右平移若干位,右边移出的部分予以忽略,左边空出的位置对于无符号数补零,对于有符号数,若原符号位为 0,则补 0,若原符号位为 1,则全补 1。也就是右移后保持这个数的正负符号不变。例如,若变量 a被定义成
6、unsigned char,即无符号型,则有:a=10011010/*十六进制为9a*/a>>2=00100110/*十六进制为26*/若变量 a被定义成char,即有符号型,则有:a=10011010/*十六进制为9a*/a>>2=11100110/*十六进制为e6*/同样,一个数据每右移1 位相当于除以 2,右移 2 位相当于除以 4,以此类推。9.1.5 按位与运算符运算符“&”将其两边数据对应的各个二进制位分别进行“与”运算,即二者都为1 时结果为 1,否则为 0。如:a=10111010/*十六进制为ba*/b=01101110/*十六进制为6e*/a&b=0010
7、1010/*十六进制为2a*/可以发现,任何一位与 1“与”运算时,结果保持原值,与 0“与”运算时,结果皆为0。如果参加&运算的是负数(如3&5),则以补码形式表示为二进制数,然后按位进行“与”运算。按位与有一些特殊的用途:(1)清零。如果想将一个数的某些位清零,只要找一个二进制数,其中相应位为 0,然后使二者进行&运算,即可达到清零目的。如:原有数为 00101011,现使它低四位清零。另找一个数,设它为 10010000,低四位均为 0。将两个数进行&运算:00101011 (&) 10010000 00000000 其道理是显然的。当然也可以不用 10010000 这
8、个数而用其他数(如 01000000)也可以。(2)保留一个数中某些指定位。如果想保留一个数中某些指定位,只要找一个二进制数,其中相应位为 1,然后使二者进行&运算,即可达到目的。如有一个整数 a(2 个字节),想要其中的低字节。只需将 a与(377)o按位与即可。【例9.1】将一个十进制数转换为二进制数。分析:C语言中printf函数提供的%x、%d、%o 格式符可将一个整数以十六进制、十进制或八进制的形式输出,但没有二进制输出格式。人工转换的方法是设置一个屏蔽字,其中只有一位是 1,其余各位均为0,与被转换数进行“与”运算,根据运算结果判断被测试的那一位是1 还是 0,其
9、余二进位的测试方法相同。一个整数占 4 个字节,共有32 个二进制位。/*源程序名:CH0901.C*//*01*/#include /*02*/void main()/*03*/{ /*04*/int i,bit;/*05*/unsigned int n,mask; /*06*/mask=0x80000000; /*最高位为1,其余位为0*//*07*/printf("enteryournumber:"); /*08*/scanf("%d",&n);/*09*/printf("bin
此文档下载收益归作者所有