C++位操作技巧
一、注意事项:
a、与:&,两位都为1,才为1;
b、或:|,两位都为0,才为0;
c、微操作只能用于整形数据,float和double进行位操作时编译器会报错;
d、异或:^,两位相同为0,不同为1;
e、取反:~,1变为0,0变为1;
f、左移:<<,各二进制全部向左移位,高位丢失,低位补零;
g、右移:>>,各二进制全部向右移位,对于无符号数,低位丢失,高位补零;有符号数个编译器不同,有的补符号位,有的补0;
二、技巧用途:
1、判断奇偶:
只要判断二进制最末尾是0还是1即可判断,为0则是偶数,为1则为奇数;因此用if(a & 1) == 0代替if(a%2 == 0)来判断a是不是偶数。
输出1到100所有的奇数:
[cpp]
if(i = 0; i < 100; i++)
if(i&1)
printf("%d ", i);
2、交换两个数(整形的)
[cpp]
void swap(int &a, int &b){
a ^= b;
b ^= a;
a ^= b;
}
3、变换符号:
整数变复数,复数变正数;操作是,对整数取反加1;
[cpp]
int signlReverse(int a){
return ~a + 1;
}
4、求绝对值:
方法一:
[cpp]
int abs(int a){
int i >> 31;//获取符号位,a为正数i为0,a为负数i为-1
return i == 0 ? a : (~a + 1);//i为零表示正数直接返回a,为-1表示负数,返回其相反数;
}
方法二:
[cpp]
int abs(int a){
int i >> 31;//获取符号位<span style="font-family:Arial,Helvetica,sans-serif">,a为正数i为0,a为负数i为-1</span>
return ((a^i) - i);//如果a为正数,则i=0,a^i的值不变(任何数和0异或都不变),-i后a不变,返回a;如果a为负数,则i=-1(即0xFFFFFFFF),a^i相当于给各位取反,在-i则相当于+1,返回a的相反数;
}
补充:软件开发 , C++ ,