程序设计基本概念——运算符

注:内容都是来自 面试宝典 的,博客是写给自己看的总结。


1. 位运算的奇妙应用

(1)用一个表达式,判断一个数 X 是否是 2 的 N 次方 (1,2,4,8,16,..),不可用循环语句。

          答:2 的 0 次方写成二进制是:0

                  2 的 1 次方写成二进制是:10

                  2 的 2 次方写成二进制是:100

                  2 的 3 次方写成二进制是:1000

                 所以表达式为:!(X & ( X - 1))           // 位与运算


(2)下面代码是什么意思?

int f(int x, int y)
{
    return (x & y) + ((x ^ y) >> 1);
}

        答:是求 x 和 y 的平均值

        为什么呢?

        & 和 ^ 是位与运算和异或运算。

        当 x 和 y 对应位相同时:对应位都为1, 则 1 位与 1,结果是 1,相当于是 (1+1)/ 2。

                                              对应为都为0, 则 0 位与 0,结果是 0,相当于是 (0+0)/ 2。

        当 x 和 y 对应位不同时:对应位分别是 1 和 0, 异或后,结果是 1, 右移一位,相当于除 2, 所以总体相当于是 (1 + 0)/ 2。

        那么,函数 f 的意义就是:求平均值。


(3)用位运算实现两个整数的加法运算

int Add(int a, int b)
{
}
a 和 b 如果进行位与运算:那么位运算结果,如果为1,就代表进位,如果为0,就代表不进位。 

                                             可以把 a & b 作为进位与否的判定,进位为0,或者进位为1。

a 和 b 如果进行异或运算:运算结果是 没有加进位 的结果。

那么 上述两个步骤的结果再相加,即为最终加法运算结果。

int Add(int a, int b)
{
    if (b == 0)  return a;  // 没有进位时,返回a
    int num, jinWei;
    num = a ^ b;
    jinWei = (a & b) << 1;  // 左移进位
    return (num, jinWei);

}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值