1)
#include <stdio.h>
int i = 1;
int main(int argc, char* argv[])
{
int i = i;
printf("%d \n",i);
return 0;
}
可以猜想到底输出什么东东,其实在main里面,因为申明了i变量,所以main函数里面的i不是外面的i,然而i并未初始化,故i的值是没有定义的。
2)
int fun(int x)
{
int count=0;
while(x){
count++;
x=x&(x-1);
}
return count;
}
需要搞清这个函数是干嘛的?
x=x&(x-1);这个东东才是主要的,所做的事情就是把x的二进制从右到左将1置为0.所以这个函数就是数x的二进制中的1的个数的
3)判断一个数(x)是否是2的n次方
#include <stdio.h>
int func(int x)
{
if( (x&(x-1)) == 0 )
return 1;
else
return 0;
}
int main()
{
int x = 8;
printf("%d\n", func(x));
}
注: 如果一个数是2的n次方,那么这个数用二进制表示时其最高位为1,其余位为0。
4)
unsigned char a=0xa5;
unsigned char b=~a>>4+1;
printf("%d\n",b);
以下是反汇编代码:
unsigned char a=0xa5;
00401056 C6 45 F0 A5 mov byte ptr [ebp-10h],0A5h
unsigned char b=~a>>4+1;
0040105A 8B 45 F0 mov eax,dword ptr [ebp-10h]
0040105D 25 FF 00 00 00 and eax,0FFh
00401062 F7 D0 not eax
00401064 C1 F8 05 sar eax,5
00401067 88 45 EC mov byte ptr [ebp-14h],al
printf("%d\n",b);
0040106A 8B 4D EC mov ecx,dword ptr [ebp-14h]
0040106D 81 E1 FF 00 00 00 and ecx,0FFh
00401073 51 push ecx
00401074 68 1C 50 43 00 push offset string "%d\n" (0043501c)
00401079 E8 02 71 00 00 call printf (00408180)
0040107E 83 C4 08 add esp,8
看到汇编代码,一目了然。可以看出,and、not等操作是在eax中进行,not操作会使得其高位都取反,再右移则会使得eax为FF FF FF FA。
最后在printf参数压栈时会取低8位而已:and ecx,0FFh。
5)
int f(int x,int y)
{
return (x&y)+((x^y)>>1);
}
细细评味,可以看出,这是在求x+y的一半哦