一些程序设计的题

本文通过几个具体的C++代码示例介绍了位运算的应用,包括如何判断一个数是否为2的幂、计算二进制中1的个数以及计算两数的平均值等,深入解析了这些操作背后的原理。

1.

int i = 1;

int main()

{

   int i = i;

   cout << i << endl;

   return 0;

}

这是合法但不合理的。int i = ii变量从声明那一刻起就是可见的了。main()里的i不是1,它和main()外的i无关,是一个未定义的值。

 

2.

int func(int x)

{

   int count = 0;

   while (x)

   {

      count ++;

      x = x & (x-1);

   }

   return count;

}

 

int main()

{

   cout << func(9999) << endl;

   return 0;

}

 

func函数返回值是形参x转换为二进制后包含1的数量。9999转换为二进制是10011100001111,共8个1。

 

3.

int main()

{

   int arr[] = {6, 7, 8, 9, 10};

   int *ptr = arr;

   *(ptr++) += 123;

   printf("%d,%d/n", *ptr, *(++ptr));

   return 0;

}

 

注意:printf计算参数时是从右到左压栈的,此题结果为8,8

 

4.

int main()

{

   unsigned int a = 0xfffffff7;

   //字节截断,i变量3位和高于3位将被自动丢弃

   unsigned char i = (unsigned char)a;

   //unsigned int型指针转换为char型指针

   //char类型指针的转换,而不是char类型的换转

   char *b = (char *)&a;

   printf("%08x,%08x/n", i, *b);

   return 0;

}

 

 

运行结果:000000f7,fffffff7

 

5.用一个表达式,判断一个数X是否是2的n次方,不可用循环语句。

   答案:!(x&(x-1))

 

6.

int func(int x, int y)

{

   return (x&y)+((x^y)>>1);

}

 

int main()

{

   cout << func(729,271) << endl;

   return 0;

}

 

func函数中,x&y的结果是x和y相同位的一半,x^y是取x和y的不同位,右移相当于除以2.

所以,这个函数的功能是取两个数的平均值。

运行结果:500

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值