《程序员面试宝典》 (x&y) + ( (x^y)>>1 )

我会带着你远行 2022-08-06 10:11 278阅读 0赞

《程序员面试宝典》第四版39页的题:

  1. int f(int x, int y) {
  2. return (x & y) + ((x ^ y) >> 1);
  3. }
  4. //求f(334 + 995)的值

认为作者的思路不太理解的。下面给出我的思路:

对于数的二进制&、^运算,某位的运算无非就是三种情况:(1)1与1运算;(2)1与0运算;(3)0与0运算。

1与0运算

1&0结果为0, 1^0结果为1,那么只考虑^运算,该位就是1。

1与1运算

两个数的二进制运算中若某位上两个数均为1,则1&1为1, 1^1的结果为0,那么只考虑&运算,相当于(1+1)/ 2 = 1。即1与1使得该位为2,需要进位,但这里取了一半(除2)。

0与0运算

0&0为0, 0^0为0,则均不用考虑,该位为0即可。

由上面分析可得,当两个数某位均为1时,&操作会使得该位进位变为原来该位数的2倍,现在1&1使得该位为2的一半;当两个数某位不同时,&操作为0,不影响数。

而0^1为1,那么(0 ^ 1) / 2为该位数的一半

所以,

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

相当于 加号左右的两部分都是原来的 一半,因此f(x, y)相当于 (x + y) / 2.

发表评论

表情:
评论列表 (有 0 条评论,278人围观)

还没有评论,来说两句吧...

相关阅读

    相关 程序员面试

    第一章 类 1.1 为什么构造函数不可以是虚函数 ①从存储空间角度 虚函数对应一个vtable(虚函数表),这大家都知道,可是这个vtable其实是存储在对象的内

    相关 高级程序员面试

    说一下大型网站架构演变过程 1.初始阶段,这个阶段可能应用服务器、文件服务器、数据库所有的资源都在同一台服务器上 2.应用服务器和数据库服务器拆分 3.使用缓存改善网站的

    相关 DIY主题讨论3:XY问题

    你遇到过最山寨的问题是什么 曾经一个稳定运行的老项目突然崩了,线上由于历史原因项目框架配置不完善,执行日志都被吞掉了,问题现象是涉及一张业务表的查询接口查不到数据。第一反