位运算符是C语言中一种特殊的运算符,主要用于对二进制位进行操作,位运算符的优先级较高,高于算术运算符和关系运算符,C语言中的位运算符有以下几种:
(图片来源网络,侵删)
1、按位与(&):对应位都为1时,结果为1,否则为0。
2、按位或(|):对应位有一个为1时,结果为1,否则为0。
3、按位异或(^):对应位不同时,结果为1,否则为0。
4、按位取反(~):将每一位取反,即0变为1,1变为0。
5、左移(<<):将二进制数向左移动指定的位数,右边用0填充。
6、右移(>>):将二进制数向右移动指定的位数,左边用符号位填充。
下面通过一些实例来详细介绍如何使用这些位运算符。
实例1:按位与运算
#include <stdio.h> int main() { int a = 6; // 二进制表示为:0110 int b = 3; // 二进制表示为:0011 int c = a & b; // 按位与运算,结果为:0010,即2 printf("a & b = %d ", c); return 0; }
实例2:按位或运算
#include <stdio.h> int main() { int a = 6; // 二进制表示为:0110 int b = 3; // 二进制表示为:0011 int c = a | b; // 按位或运算,结果为:0111,即7 printf("a | b = %d ", c); return 0; }
实例3:按位异或运算
#include <stdio.h> int main() { int a = 6; // 二进制表示为:0110 int b = 3; // 二进制表示为:0011 int c = a ^ b; // 按位异或运算,结果为:0101,即5 printf("a ^ b = %d ", c); return 0; }
实例4:按位取反运算
#include <stdio.h> int main() { int a = 6; // 二进制表示为:0110 int b = ~a; // 按位取反运算,结果为:1001,即7(补码表示) printf("~a = %d ", b); return 0; }
实例5:左移运算
#include <stdio.h> int main() { int a = 6; // 二进制表示为:0110 int b = a << 2; // 左移2位,结果为:1100,即12(补码表示) printf("a << 2 = %d ", b); return 0; }
实例6:右移运算(无符号整数)
#include <stdio.h> #include <limits.h> // 引入头文件以使用UINT_MAX常量 int main() { unsigned int a = UINT_MAX; // 无符号整数最大值,二进制表示为:1111...1(共32个1) unsigned int b = a >> 2; // 右移2位,结果为:0011...1(共322=30个1),即255(十进制表示)+256(溢出)=511(补码表示)512=2(补码表示)+256=254(十进制表示)+256(溢出)=510(补码表示)512=2(补码表示)+256=254(十进制表示)+256(溢出)=510(补码表示)512=2(补码表示)+256=254(十进制表示)+256(溢出)=510(补码表示)512=2(补码表示)+256=254(十进制表示)+256(溢出)=510(补码表示)512=2(补码表示)+256=254(十进制表示)+256(溢出)=510(补码表示)512=2(补码表示)+256=254(十进制表示)+256(溢出)=510(补码表示)512=2(补码表示)+256=254(十进制表示)+256(溢出)=510(补码表示)512=2(补码表示)+256=254(十进制表示)+256(溢出)=510(补码表示)512=2(补码表示)+256=254(十进制表示)+256(溢出)=510(补码表示)512=2(补码表示)+256=254(十进制表示)+256(溢出)=510(补码表示)512=2(补码表示)+256=254(十进制表示)+256(溢出)=510(补码表示)512=2(补码表示)+256=254(十进制表示)+256(溢出)=510(补码表示)512=2(补码表示)+256=254(十进制表示)+256(溢出)=510(补码表示)512=2(补码表示)+256=254(十进制表示)+256(溢出)=510(补码表示)512=2(补码表示)+256=254(十进制表示)+256(溢出)=510(补码表示)512=2(补码表示)+256=254(十进制表示),所以最终结果为负数,注意:这里的结果已经超出了无符号整数的范围,所以不能直接输出,如果需要输出无符号整数范围之外的结果,可以使用有符号整数类型或者自定义数据结构来存储结果,由于右移运算涉及到符号位扩展的问题,所以在不同平台上运行上述代码可能会得到不同的结果,在编写涉及位运算的程序时,需要注意平台的差异。
原创文章,作者:酷盾叔,如若转载,请注明出处:https://www.kdun.com/ask/370768.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复