按位运算将整数换算成二进制数参与运算
按位与&常用作
1、让某一位或者某些位为0
例如:将0x5B = 二进制:0101 1011的最后一位化为0
十六进制:0xFE = 二进制:1111 1110
十六进制:0x5B = 二进制:0101 1011
0xFE & 0x5B = 0x5A=0101 1010 (0x5A)
1111 1110
(两个位都是1的保留1否则都是0)
& 0101 1011
_______________
= 0101 1010 (0x5A)
使0x5B的最后一位二进制变为0变成0x5A
2、取一个数中的某一段
例如:取十六进制:0x5AC6 = 二进制:0101 1010 1100 0110的后两断
十六进制:0x00FF = 二进制:0000 0000 1111 1111
十六进制:0x5AC6 = 二进制:0101 1010 1100 0110
0x00FF & 0x5AC6 = 0000 0000 1100 0110 (0x00C6)
0000 0000 1111 1111
(两个位都是1的保留1否则都是0)
& 0101 1010 1100 0110
__________________________
= 0000 0000 1100 0110 (0x00C6)
只取0x5AC6的最后两段二进制数使其变成0x00C6
按位或 | 常用作
1、使一位或者几位为1
例如:使0100 1010的第4位和最后一位变成1
十六进制:0x4A = 二进制:0100 1010
十六进制:0x11 = 二进制:0001 0001
0x4A | 0x11 = 0101 1011 (0x5B)
0100 1010
| (有一位是1便等于1,两位都为0则是0)
0001 0001
——————————————————
= 0101 1011 (0x5B)
使0100 1010的第4位和最后一位变成1
2、把两个数拼接起来
例如:使0x00FF和0xFF00合并为一个数
十六进制:0x00FF = 二进制:0000 0000 1111 1111
十六进制:0xFF00 = 二进制:1111 1111 0000 0000
0x00FF | 0xFF00 = 1111 1111 1111 1111 (0xFFFF)
0000 0000 1111 1111
| (有一位是1便等于1,两位都为0则是0)
1111 1111 0000 0000
————————————————————————————
= 1111 1111 1111 1111 (0xFFFF)
使0x00FF和0xFF00合并为一个数
3、按位取反~
常用作将数字的二进制数的0变成1,1变成0
例如:
十六进制:0x3D = 二进制0011 1101
按位取反
~0x3D = ~0011 1101 = 1100 0010 (0xC2)
~ 0011 1101
——————————————————
= 1100 0010 (0xC2)
求补码
1 0000 0000
- 0011 1101
___________________
= 1100 0011 (0xC3)
按位取反与求补码不同
按位取反是直接将是0的位数转化为1,将是1的位数转化为0
求补码是用比他溢出一位的数减去他本身
4、按位异或 ^
二进制中如果两位相等结果是0如果不相等结果是1
对于同一个变量用同一个值异或两次等于原变量
x^y^y=x
例如:
十六进制:0x4A = 二进制:0100 1010
十六进制:0x11 = 二进制:0001 0001
0x4A ^ 0x11 =
0100 1010
^
0001 0001
_________________
= 0101 1011 (0x5B)
0101 1011
^
0001 0001
_______________
= 0100 1010 (0x4A)
对于同一个变量(0x4A=0100 1010)用同一个值(0x11=0001 0001)异或两次等于原变量
5、左移<<
i<<j是i中的所有位向左移j个位置从右边填入0
x<<1等价于x*=2
x<<n等价于x*=
十六进制:0xA5 = 二进制:1010 0101 = 十进制165
十六进制:0x294 = 二进制0010 1001 0100 = 十进制660=165*
1010 0101 << 2
=10 1001 0100
2 9 4
6、右移>>
i>>j是i中的所有位向右移j个位置
对于unsigned(无符号类型)左边填入0
对于signed(有符号类型)左边填入数字原来最高位,符号保持不变
x>>1等价于x/=2
x>>n等价于x/=
#include <stdio.h>
int main()
{
int a=165;
int b=-165;
printf("十进制%d\n",a);
printf("十六进制%x\n",a);
printf("右移后十进制%d\n",a>>2);
printf("右移后十六进制%x\n",a>>2);
printf("右移后十进制%d\n",b>>2);
printf("十进制%d\n",a);
printf("十六进制%x\n",a);
printf("左移后十进制%d\n",a<<2);
printf("左移后十六进制%x\n",a<<2);
return 0;
}
注:计算机内部只有按位运算没有逻辑运算
所谓的逻辑运算实际上就是把参与运算的数字的非0值全变成1然后用1参与按位运算
例如:
按位运算:5&4= 0101 & 0100 = 0100 = 4
逻辑运算:5 && 4= 1&1=1
按位运算:5 | 4= 0101 | 0100 = 0101 = 5
逻辑运算:5 || 4= 1||1=1
按位运算:~4= ~0100= 0011 = 3
(注意:只算有效值,4的二进制是0100实际有效值只有100,所以转化后是011即0011)
逻辑运算:!4= !1=0