常见位运算中的典型应用
以与,或,异或举例说明。
或运算 | 将某一位置为1 |
---|---|
与运算 | 将某一位清零 |
异或运算 | 将某一位翻转 交换两个数的值 |
异或运算性质 | 0^n = n(任何数和0异或都是本身) a ^ b = b ^ a(交换律) a ^ b ^ c = a ^ (b ^ c)(结合律,可以改变运算顺序) |
- 或运算 改变某一位,置为1。 方法:将数据与1左移动若干位进行或运算即可。
#include <stdio.h>
#include <stdlib.h>
int main()
{
//或运算 将某一位置为1。将数据与1左移动进行或运算即可
unsigned char a = 0xa2,n = 6; //1010 0010
a |= (1 << n);
printf("a = %#x\n",a); //1110 0010
return 0;
}
输出结果:
a = 0xe2
原理:将变量a和某个数据按位或运算。
- 与运算 将某一位清零。方法:将数据与1左移动将数据与1左移动取反进行与运算。
#include <stdio.h>
#include <stdlib.h>
int main()
{
//与运算 清除某一位(清零) 将数据与1左移动取反进行与运算
unsigned char a = 0xa4, n = 2;
a &= ~(1<<2);
printf("a = %#x\n",a);
return 0;
}
输出结果:
a = 0xa0
原理:将变量a和某个数据取反之后按位与运算。
- 异或运算
(1)将某一位翻转 方法:将数据和1左移动异或运算。
#include <stdio.h>
#include <stdlib.h>
int main()
{
//异或运算 按位翻转(将某位取反) 将数据和1左移动异或运算
unsigned char a = 0xa4, n = 2;
a ^= (1<<2);
printf("a = %#x\n",a);
return 0;
}
输出结果:
a = 0xa0
原理:将数据和1做移动异或运算。
(2)交换两个数
#include <stdio.h>
#include <stdlib.h>
int main()
{
//异或操作 交换两个数
int a = 10, b = 20;
printf("before:a = %d,b = %d\n",a,b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("after:a = %d,b = %d\n",a,b);
return 0;
}
输出结果:
before:a = 10,b = 20
after:a = 20,b = 10