(1)^异或
1) A和B的变量交换
a=a^b;
b=a^b;
a=a^b;
2)绝对值
y=x>>31;
(x^y)-y;
(2)&按位与
1) 验证时候2的幂
if(!X&(X-1))
X=X&(X-1)到为0前的运行次数
(3)>>右移位
1) 除2
X>>1
(x&y)+((x^y)>>1)
3)加法
Add(int a,int ,b){
if(b==0) return a;
int sum=a^b;
int carry=(a&b)<<1;
return Add(sum,carry);
}
(4)左移<<
1)快速乘法
3乘以8————3<<3 左移3位
3乘以7————(3<<3)-3 左翼3位相当于乘以8,然后在减去自身一次
1)求较大值
((a+b)+abs(a-b))/2
(6)如何判断一个数是有符号数或者是无符号数
1)采用取反操作
#define ISUNSIGNED(a) (a>=0 && ~a=0)
#define ISUNSIGNED(type) ((type)0-1>0)
无符号数的取反和求正都是整数。
注意:有符号数的正数首位为0,负数为1,求反操作会把1变为0,0变为1
2)通过改变符号位
A=A|(a<<31);
位运算,最高位置1,看看是否大于零;
有符号数会变为负数。
3)有符号函数和有符号数相减为无符号数
(7)查看自身机器的位数
1)对0取反
2)最大数输出