C++ 位运算符 OR(|), AND(&), XOR(^), 取反, 左移, 右移

在这里插入图片描述

注:转载请标明原文出处链接:https://xiongyiming.blog.csdn.net/article/details/101105913


C++ 按位运算符 OR(|), AND(&), XOR(^)

1 | 按位或运算符

OR(|) 对两个整数值进行操作,生成一个新的值。现将两个数写成二进制,然后将每位进行逻辑或操作(两个值只要有1,结果为1,否则为0)。例如:
(1)

	int a = 1;
	int b = 1;
	int c =( a | b);
	cout << c << endl;

c=1


(2)

	int a = 0;
	int b = 1;
	int c =( a | b);
	cout << c << endl;
	cout << endl;

c=1


(3)

	int a = 0;
	int b = 0;
	int c =( a | b);
	cout << c << endl;

c=0


(4)

	int a = 1;
	int b = 2;
	int c =( a | b);
	cout << c << endl;
	cout << endl;

先将1,2分别转为二进制,01,10。然后进行或操作,二进制结果为11,转为十进制为3.
因此 c=3 .


2 & 按位与运算符

AND(&) 对两个整数值进行操作,生成一个新的值。现将两个数写成二进制,然后将每位进行逻辑与操作(两个值都为1,结果为1,否则为0)。例如:

(1)

	int a = 1;
	int b = 1;
	int c =( a & b);
	cout << c << endl;

c=1


(2)

	int a = 1;
	int b = 0;
	int c =( a & b);
	cout << c << endl;

c=0


(3)

	int a = 0;
	int b = 0;
	int c =( a & b);
	cout << c << endl;

c=0


(4)

	int a = 1;
	int b = 2;
	int c =( a & b);
	cout << c << endl;

先将1,2分别转为二进制,01,10。然后进行与操作,二进制结果为00,转为十进制为0.
因此 c=0 .


3 ^ 按位异或运算符

XOR(^) 对两个整数值进行操作,生成一个新的值。现将两个数写成二进制,然后将每位进行逻辑异或操作(两个值不同时结果为1,两个值相时结果为0)。例如:

(1)

	int a = 1;
	int b = 1;
	int c =( a ^ b);
	cout << c << endl;

c=0


(2)

	int a = 0;
	int b = 1;
	int c =( a ^ b);
	cout << c << endl;

c=1


(3)

	int a = 0;
	int b = 0;
	int c =( a ^ b);
	cout << c << endl;

c=0


(4)

	int a = 1;
	int b = 2;
	int c =( a ^ b);
	cout << c << endl;

先将1,2分别转为二进制,01,10。然后进行异或操作,二进制结果为11,转为十进制为3.
因此 c=3 .


4 ^ 求反运算符

求反运算符~为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。

例如~9 的运算为:
~(0000000000001001) 结果为: 1111111111110110


5 << 左移运算符

左移运算符“ <<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补 0。

左移相当于该数乘以2的n次方。

例如:
      a<<4;
指把 a 的各二进位向左移动 4 位。如 a=00000011(十进制 3),左移 4 位后为 00110000(十进制 48)。(可以理解a的二进制左移4位,右边补0)

问:
A) i=i*8;
B) i=i<<3;
A和B哪个语句执行速度快?
答案:选项B速度快


6 >> 右移运算符

右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位, “>>”右边的数指定移动的位数。

右移相当于该数除以2的n次方,前提是数据不能丢失。

例如:
设 a=15;
      a>>2;
表示把 000001111 右移为 00000011(十进制 3)。(可以理解a的二进制右移2位,左边补0)

问:
A) i=i/8;
B) i=i>>3;
A和B哪个语句执行速度快?
答案:选项B速度快



位运算度的意义: 通过位运算符可以对数据的操作精确到每一位。

以下是一个实现上述要求的C语言程序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LEN 100 void print_binary(char *bin_str); int main(int argc, char *argv[]) { if (argc != 3) { printf("Usage: %s binary_str1 binary_str2\n", argv[0]); exit(EXIT_FAILURE); } char *bin_str1 = argv[1]; char *bin_str2 = argv[2]; // ~ 按位取反 int num1 = ~strtol(bin_str1, NULL, 2); int num2 = ~strtol(bin_str2, NULL, 2); printf("~%s = ", bin_str1); print_binary(num1); printf("\n~%s = ", bin_str2); print_binary(num2); printf("\n"); // & 按位与 int and_result = strtol(bin_str1, NULL, 2) & strtol(bin_str2, NULL, 2); printf("%s & %s = ", bin_str1, bin_str2); print_binary(and_result); printf("\n"); // | 按位或 int or_result = strtol(bin_str1, NULL, 2) | strtol(bin_str2, NULL, 2); printf("%s | %s = ", bin_str1, bin_str2); print_binary(or_result); printf("\n"); // ^ 按位异或 int xor_result = strtol(bin_str1, NULL, 2) ^ strtol(bin_str2, NULL, 2); printf("%s ^ %s = ", bin_str1, bin_str2); print_binary(xor_result); printf("\n"); return 0; } // 将整数以二进制字符串形式输出 void print_binary(char *bin_str) { int num = strtol(bin_str, NULL, 2); printf("%d (0b%s)", num, bin_str); } void print_binary(int num) { int bits = sizeof(num) * 8; char bin_str[MAX_LEN]; memset(bin_str, 0, MAX_LEN); // 将整数转换为二进制字符串 for (int i = bits - 1; i >= 0; i--) { if ((num >> i) & 1) { strcat(bin_str, "1"); } else { strcat(bin_str, "0"); } } printf("%d (0b%s)", num, bin_str); } ``` 在命令行中运行程序,例如: ``` $ ./binary_ops 1010 1100 ~1010 = -11 (0b11110101) ~1100 = -13 (0b11110100) 1010 & 1100 = 1000 (0b00001000) 1010 | 1100 = 1110 (0b00001110) 1010 ^ 1100 = 110 (0b00000110) ``` 程序会按照要求输出两个二进制字符串的按位取反、按位与、按位或和按位异或的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TechArtisan6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值