(一)考点:类型转换、算符的优先级
#include <iostream>
using namespace std;
int main()
{
unsigned char a=0xA5;
unsigned char b=~a>>4+1;
printf("b=%d\n",b); //250
return 0;
}
(二)用一个表达式,判断一个数X是否是2^n次方(2,4,8,16.......),不可用循环语句。
2、4、8、16.......这样的书转化成二进制是10、100 1000 10000.。。。。。如果X减去1后与X做与运算,答案如果是0,则是X是2^n次方
!(X&(X-1))
(三)求平均数
int f(int x,inty)
{
return (x&y)+((x^y)>>1);
}
如果你能看出这是求x+y的平均数,就不必看解释了。
解释如下:
(x&y)解释为x、y共同为1的部分,也就相当为相同为的一半
(x^y)>>1解释为x、y不相同的部分求和,右移相当于除2
(四)找出两个数中间比较大的
int max=((a+b)+abs(a-b))/2;
除可用if、?:、switch
(五)如何将a、b的值进行交换,并且不使用任何中间变量?
答:两种方法
【1】a=a+b;
b=a-b;
a=a-b; 缺点:a=a+b时有可能造成越界
【2】用异或 a=a^b;
b=a^b;
a=a^b;