经典笔试集锦

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的一半哦


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

failwest9527

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值