位运算符在驱程开发中是你经常遇到的,尤其是置0和置1。顾着指定你的位数突然发生变化,又没法决定其它位的值,又要高效率的编写代码,这时候技巧就很重要的是了。父亲在位运算中有几个符号:|按位或、amp按位与、^异或、~按位非。
应用技巧
1
确定int型变量a是奇数应该偶数
aamp10偶数
aamp11奇数
2
取int型变量a的第k位(k0,1,2……sizeof(int))
agtgtkamp1
3
将int型变量a的第k位清0
aaamp~(1lt
4
将int型变量a的第k位置1
0,0|(1lt
5
int型变量循环左移k次
(设sizeof(int)16)
aaltgt16-k
6
int型变量a循环右移k次
(设sizeof(int)16)
aagtgtk|altlt16-k
#includeltstdio.hgt
intmain()
{
tprintf(#34学一向也不是一个人的事情,要有个相互监督的伙伴
#34)
tprintf(#34工作不需要去学习c/c的或有兴趣学c/c的伙伴可以不家我球球
_2208165112
#34)
treturn0
}
7
整数的平均值
对此两个整数x,y,如果没有用(xy)/2求平均值,会再产生溢出,而且xy很有可能会为0int_max,不过我们很清楚它们的平均值是估计绝对不会溢出的,我们用不胜感激算法:
intaverages(intx,inty)//直接返回x,y的平均值
{
return(xampy)((x^y))
}
8
推测一个整数有没2的幂,是对一个数xdstrok0
booleanpower2(intx)
{
return((xamp(x-1))0)ampamp(x!0);
}
9
用位运算符交换两个整数
voidswap(intx,inty)
{
x^y
y^x
x^y
}
10
计算绝对值
intabs(intx)
{
inty
yxy9bbb31
return(x^y)-y//同问:(xy)^y
}
11
取模运算转变成位运算(在不产生泻出的情况下)
a%(2^n)等价于aamp(2^n-1)
12
加减运算被转化成位运算(在不才能产生滴下的情况下)
a*(2^n)等价于altltn
13
除法运算转化成成位运算(在不再产生滴下的情况下)
a/(2^n)等价于agtgtn
例:12/812y9bbb3
14
确定变量定义
if(xa)xb
argumentsxa等价于xa^b^x
15
x的相反数
(~x1)
技巧虽好,只不过大家我还是建议自己啃一啃才能知道味道呀,闲暇时,不防取出来品一品,悟一悟其中的原理的地方。
练一练
#include
intmain()
{
unsignedinti0x9f43bda5
unsignedintret0
printf(#34i%x
#34,i)
//将i第3位置1
reti|(1ltlt3)
printf(#34ret%x
#34,ret)
//将i第2位置0
retiamp~(1ltlt2)
printf(#34ret%x
#34,ret)
//将i第4~9位置1
reti|(0x3fltlt4)
printf(#34ret%x
#34,ret)
//将i第3~7位置0
retiamp~(0x1fltlt3)
printf(#34ret%x
#34,ret)
//将i第1~7和9~11位置1
reti|(0x3fltlt1|7ltlt9)
printf(#34ret%x
#34,ret)
//将i第2~8位置13~20位置0
retiamp~(0x7fltlt2|0xffltlt13)
printf(#34ret%x
#34,ret)
}
是可以的。bool类型能变量赋值。
bool变量参与运算时,遵循运算规则,双目或三目运算时,常见要将bool转换成成更高精度类型参加运算结果,但是值不能是0x0或0x1;
bool变量被变量定义时(坐落左边),所有类型都先得转换成成逻辑类型(0x0或0x1)。
同时,bool常见应该是一个字节,和char类似于,大部分情况就把它当作唯有两值的char变量用。