C语言位运算
有6种: &, | , ^(亦或), <<(左移), >>(右移)。
注意:参与位运算的元素必须是int型或者char型,以补码形式出现。
按位与&
&运算常应用于:
- 迅速清零
- 保留指定位
- 判断奇偶性
a & 1 = 1;则a为奇数
b & 1 = 0;则a为偶数
#include <stdio.h>
int main()
{
//C运算符之&
int a = 4; //00000000 00000000 00000000 00000100
int b = 7; //00000000 00000000 00000000 00000111
int c = a & b; //00000000 00000000 00000000 00000100
printf("c = %d\n",c);//4
return 0;
}
按位或|
按位或(“|”)用途:设定数据的指定位
#include <stdio.h>
int main()
{
//C运算符之&
int a = 9; //00000000 00000000 00000000 00001001
int b = 5; //00000000 00000000 00000000 00000101
int c = a | b; //00000000 00000000 00000000 00001101
printf("c = %d\n",c);//13
//用途,设定数据的指定位,如下为指定后8位全为1
a = a|0xFF;//0xFF,转为十进制就是255,转为二进制就是11111111
printf("a = %d\n",a);
return 0;
}
按位异或^
异或 就是位相同等于零,相异等于1
按位异或作用:
1.定位反转
2.交换数值
//交换a和b的值
a=a^b;
b=b^a;
a=a^b;
#include <stdio.h>
int main()
{
//C运算符之&
int a = 9; //00000000 00000000 00000000 00001001
int b = 5; //00000000 00000000 00000000 00000101
int c = a ^ b; //00000000 00000000 00000000 00001100
printf("c = %d\n",c);//12
//用途
//1.定位反转
//2.交换数值
//a = a|0xFF;//定位反转
//交换数值
//00000000 00000000 00000000 00001100 a = a ^ b;
a = a ^ b;
//00000000 00000000 00000000 00000101 b
//00000000 00000000 00000000 00001100 a
//00000000 00000000 00000000 00001001 b = b ^ a;
b = b ^ a;
//00000000 00000000 00000000 00001100 a
//00000000 00000000 00000000 00001001 b
//00000000 00000000 00000000 00000101 a = a ^ b;
a = a ^ b;
printf("a = %d,b = %d\n",a,b);
return 0;
}
按位取反~
~(00001001) //取反后 11110110
左移、右移
让二进制左移N位,高位丢弃,低位补0,得到的 新值 = 原值*2^N,
作用:实现二倍乘除运算(右移几位相当于除于二的几次方。左移几位,相当于乘上二的几次方。)
问题:int是有符号类型,左移可能会把符号左移出去,发生溢出。
#include <stdio.h>
int main()
{
int a = 3; //00000000 00000000 00000000 000000011
a = a << 4;//00000000 00000000 00000000 000011000
printf("%d\n",a);//左移几位,相当于乘上二的几次方 3* (2^4) =3*16 = 48
}