您的位置:首页 > 编程语言 > C语言/C++

C++位操作技巧

2013-10-17 15:36 330 查看
一、注意事项:

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所有的奇数:

if(i = 0; i < 100; i++)
if(i&1)
printf("%d ", i);

2、交换两个数(整形的)

void swap(int &a, int &b){
a ^= b;
b ^= a;
a ^= b;
}

3、变换符号:

整数变复数,复数变正数;操作是,对整数取反加1;

int signlReverse(int a){
return ~a + 1;
}

4、求绝对值:

方法一:

int abs(int a){
int i >> 31;//获取符号位,a为正数i为0,a为负数i为-1
return i == 0 ? a : (~a + 1);//i为零表示正数直接返回a,为-1表示负数,返回其相反数;
}

方法二:

int abs(int a){
int i >> 31;//获取符号位,a为正数i为0,a为负数i为-1
return ((a^i) - i);//如果a为正数,则i=0,a^i的值不变(任何数和0异或都不变),-i后a不变,返回a;如果a为负数,则i=-1(即0xFFFFFFFF),a^i相当于给各位取反,在-i则相当于+1,返回a的相反数;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: