1、在C语言中,位运算符能够针对整数和字符数据的位(bit)进行逻辑与位移的运算,通常区分为“位逻辑运算符”与“位位移运算符”两种。
2、位逻辑运算符如下表:
运算符 | 功能 | 运算过程 |
---|---|---|
& | AND(与) | 逐位与 |
| | OR(或) | 逐位或 |
^ | XOR(异或) | 逐位异或 |
~ | NOR(非) | 逐位非 |
案例程序如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a=12,b=38;
printf("%d&%d=%d\n",a,b,a&b);/* AND运算 */
printf("%d|%d=%d\n",a,b,a|b);/* OR运算 */
printf("%d^%d=%d\n",a,b,a^b);/* XOR运算 */
printf("~%d=%d\n",a,~a);/* NOT运算 */
system("pause");
return 0;
}
运行结果如下:
特别注意:~(NOT,非运算)
NOT的作用是取1的补码(complement),在二进制中也就是0与1互换。例如a=12的二进制表示法为1100,取1的补码后,由于所有位都会进行0与1的互换,因此运算后的结果为-13,运算过程如下:
NOT(~)
3、位位移运算符
位位移运算符会将整数数值的各个位向左或向右移动指定的位数,C语言提供两种位位移运算符,分别是左移运算符(<<)与右移运算符(>>)。
左移运算符(<<):左移运算符可将操作数的各个位向左移动n位,左移后超出存储范围的就舍去,右边空出来的位补0。语法格式如下:
a<<n
举例:表达式“12<<2”,数值12的二进制值为1100,向左移动两位后成为110000(十进制为48)。运算过程如下:
右移运算符(>>):右移运算符(>>)与左移相反,可将操作数的各个位向右移动n位,右移后超出存储范围的就舍去。注意右边空出的位,如果数值是正数就补0,是负数则补1.语法格式如下:
a>>n
例如:表达式 “12<<2”,数值12的二进制值为1100,向右移动两位后成为0011(十进制为3)。运算过程如下:
思考一个问题:负数与左移运算符(<<)及右移运算符(>>)的关系。
我们声明a=12,分别计算12<<2与12>>2的值,接着重新设置a=-12,求-12<<2与-12>>2的值。
程序如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a=12; /* a的二进制数为00001100 */
printf("%d<<%d=%d\n",a,2,a<<2);/* 左移2位运算 */
printf("%d>>%d=%d\n",a,2,a>>2);/* 右移2位运算 */
a=-12;/* a的二进制数为11110100 */
printf("%d<<%d=%d\n",a,2,a<<2);/* 左移2位运算 */
printf("%d>>%d=%d\n",a,2,a>>2);/* 右移2位运算 */
system("pause");
return 0;
}
运行结果如下:
本专栏还有运算符的相关总结分享,持续更新中,未完待续……
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/185974.html原文链接:https://javaforall.cn