概念:位运算是指按二进制进行的运算。
一共6种
一. 按位与
&
双目运算符
结合性:自左至右
相应的二进制位都为1,则该位的结果值为1;否则为0。
0&0=0,0&1=0,1&0=0,1&1=1
如:3&5
· 00000011(3)
&00000101(5)
————————
· 00000001 (1)
用途:取一个数中某些指定位;清零
二.按位或
|
双目运算符
结合性:自左至右
相应的二进制位中只要有一个为1,该位的结果值为1。
0|0=0,0|1=1,1|0=1,1|1=1
· 00000011(3)
| 00000101(5)
————————
· 00000111 (7)
三.按位异或
^ (也称XOR运算符)
双目运算符
结合性:自左至右
同号为假 0 异号为真 1
0^0=0
0^1=1
1^0=1
1^1=0
应用:
1.使特定位翻转
2.与0异或,保留原值
3.交换两值,不用临时变量
交换两值:
除了
a=a+b
b=a-b
a=a-b;
还可以
a=a^b
b=b^a
a=a^b;
四.取反
~
单目运算
结合性:自右至左
0变1,1变0
五.左移
(<<)
双目运算
结合性:自右至左
将一个数的二进制位全部左移若干位
a=<<3
把a的二进制数左移3位,右边补0,高位左移溢出后舍弃
左移一位等于乘2,两位 乘4,三位 乘8
左移n位等于乘2的n次方,n是有范围的
(此结论只适用于左移溢出的高位中不包含1)
因为计算机对数的读取范围有限
六.右移
(>>)
双目运算
结合性:自右至左
将一个数的二进制位全部左移若干位
a=>>3
把a的二进制数右移3位,高位补0,低位溢出后舍弃
右移一位等于除2,两位 除4,三位 除8
右移n位等于除2的n次方,n是有范围的
/*取某数的指定位,这个为取2~4位*/
#include <stdio.h>
int main (void)
{
int a, b, c, d;
printf("请输入待检验数字: ");
scanf("%d", &a);
b = a>>2;
c = ~(~0 << 5);
d = b & c;
printf("%d\n", d);
}
/*大小写字母的转换,用到位运算的*/
#include<stdio.h>
#include<conio.h>
int main(void)
{
char ch,temp;
printf("请输入一个字母:\n");
ch = getchar();
temp = getchar();
while (!(ch > 'A'||ch < 'z') || (ch > 'Z'&&ch < 'a'))
{
printf("输入有误,请重新输入一个字母:\n");
ch = getchar();
}
if(ch>'a'&&ch<'z')
{
ch = ch & 223; //使第五位为0,变大写
}
else
{
ch = ch|255; //使第五位为1,变小写
}
putchar(ch);
ch = getchar(); //可以为printf(“\n”);
putchar(ch);
}