当前位置:编程学习 > C/C++ >>

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++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,