int  function(int x,int y)

{

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

}

请看上面的一段函数,输入两个整数x和y,返回x&y + (x^y)>>1。大家是否看出来这段函数是做什么的呢?因为我自己刚开始没有太明白哈,所以在学习理解之后,再给大家分享一遍,如果大家都知道,欢迎大家提出不同的意见。

大家都知道在计算机中,数值都是以二进制的形式进行存储的,在运算时也都是以二进制的形式进行运算的。

首先回顾一下Java位运算符的基础知识,位运算符是先将操作数转为二进制数,然后按位进行运算,常见的几种位运算符:

&:按位与运算符。  同1则1,有0即0。

|:按位或运算符。  同0则0,有1即1。

^:按位异或运算符。同1则0,一1即1。

>>:位移运算符,>>x 表示向右移x位

先随便找两个数值带入试一下。观察函数的计算结果,比如:

x = 5    = 0101

y = 7    = 0111

x & y    = 0101 = 5

(x ^ y)>>1 = 0010 = 2 >>1 = 0001 = 1

(x & y + (x ^ y)>>1) = 5 + 1 = 6

大家会发现计算出的结果好像是平均值,即(x + y)/ 2。为什么这样使用位运算符会达到求平均值的目的呢?因为位运算符是基于每一位进行操作的,根据这个思路,我们反推一下就会想到:是否可以把操作数的每一位都拆分一下呢,就以上面的x=5,y=7为例:

x = 5 = 0101 = 0000 + 0100 + 0000 + 0001

y = 7 = 0111 = 0000 + 0100 + 0010 + 0001

当我们把操作数拆分为各位上数值之和后,仔细观察操作数,发现运算时只会有两种情况,要么是1和1,要么是0和1。如果是1和1说明两个操作数某一位的数值是相同的,而x&y的结果是1,这样就等同于(x + y)/2。

如果是0和1,则说明这一位上,只有一个操作数有值,而x^y说明是取这一位上有值的那个操作数,然后>>1,说明有值的那个数需要除以2,相当于同一位置上数值不同的数求和后求平均值。

当拆分后的对应的各个位置上的数求和、求平均值之后,再将其运算结果加起来,是不是就是原操作数求和之后求平均值呢?

所以((x&y) + ( (x^y)>>1 )) = (x + y)/2

(xy) + ( (x^y)>>1 )相关推荐

  1. List<Map<String, Object>>——多层嵌套的数据结构

    文章目录 快速理解多重嵌套结构 Map基础知识 List 例子 查询数据库 快速理解多重嵌套结构 对于多层嵌套的数据结构,需要层层分解. 以List<Map<String, Object& ...

  2. Houdini流体>>粒子流体导出到unity笔记

    Houdini流体>>Houdini流体导出到unity笔记 一.参考资料: 1.unity中流体案例项目连接:(可选HDRP 和URP管线) https://github.com/kei ...

  3. 碟评--梁紫丹新碟<<紫色的声音>>

    今天朋友说子弹终于出新碟了,忽然觉得原来记忆里还有这个小MM,听说之前去日本学习去了,留过洋水归来,终于出碟了, 实在值得高兴,于是去下载试听之( http://www.verycd.com/topi ...

  4. 运算符“||”与“|”,“”和“”的区别 (附带各类位运算符号详解(、|、^、~、<<、>>、>>>)

    区别一: 定义不同: || 和 | 都是表示"或",区别是||只要满足第一个条件,后面的条件就不再判断,而|要对所有的条件进行判断. 区别二: 与操作和或操作的区别 (1)在Jav ...

  5. Linux中>>和>,>和<的区别? 以及“|”是什么意思?

    Linux中>>和>, >和<的区别?    以及"|"是什么意思? 一.Linux 中>>和>的区别 ? 1.>>和& ...

  6. SAP-FI章<<<<第三节:添加税码设置>>>>添加税码的特殊传输方式:100配置传输至800

    SAP-FI章<<<<第三节:添加税码设置>>>> 使用背景,FTXP添加税码的特殊传输方式:100配置传输至800** 说明:系统适用版本S4CORE ...

  7. <<飞 鸟 集>>--泰戈尔

    夏天的飞鸟,飞到我的窗前唱歌,又飞去了. 秋天的黄叶,它们没有什么可唱,只叹息一声,飞落在那里. Stray birds of summer come to my window to sing and ...

  8. Java面试汇总>>>初级工程师—面试1000题

    面试汇总>>> 每日刷题 001:重载和重写有什么区别?阐述二者是什么? 002:什么是线程池?线程池有什么优点? 003:线程有几种状态,他们是怎么切换的呢? 004:比较一下St ...

  9. Linux 中echo及echo > 和echo >>

    一.Linux 中的echo指令 Shell 的 echo 指令用于字符串的输出.详见: Shell echo命令 | 菜鸟教程 二.echo > 和echo >> echo > ...

  10. 深度(穿透)选择器 >>> /deep/ ::v-deep

    深度(穿透)选择器 ::v-deep /deep/ 及 >>> 在 vue 项目的开发过程,使用了 ElementUI 组件且样式 style 使用了 scoped 属性,当想要修改 ...

最新文章

  1. Python+OpenCV 图像处理系列(5)—— 图像 ROI 操作及通道的拆分合并
  2. c++中的基本知识点
  3. 今年两会大火的新基建,平均企业月薪1.63万 | 2020新基建中高端人才市场就业吸引力报告...
  4. J2EE的13种核心技术
  5. 使用Silverlight for Embedded开发绚丽的界面(4)
  6. 原文翻译:深度学习测试题(L1 W1 测试题)
  7. 使用sphinx搜索子域名过程中需注意的问题
  8. EasyUI datagrid 分页保持选中状态
  9. Ubuntu14.04 kylin 安装配置Tomcat7服务器
  10. 字符串的获取相关方法
  11. linux mysql清除缓存_转载-清除Linux中MySQL的使用痕迹~/.mysql_history
  12. 理解asp.net中DropDownList编辑数据源,绑定数据库数据。
  13. 程序员应该具备哪些素质
  14. 查看redis安装路径
  15. 无公式搞懂GMSK调制原理,附详细注释的matlab GMSK调制解调原理仿真源码
  16. 群英荟萃 | UINO优锘科技ThingJS平台亮相华为开发者大会
  17. 显卡是什么?显卡和Graphics的区别在哪里?
  18. 手机坏了,有必要再修吗?
  19. 成为一名合格的软件测试工程师,需要具备哪些技能?
  20. 用Python助女神发朋友圈

热门文章

  1. 《四书五经》之大学全文、注释及读解 好东西啊
  2. 屁股决定脑袋,思想决定高度
  3. 普通路由器改4g路由器_工业级路由器凭什么牛?智能组网、4G全是干货!
  4. MP3落幕,未来的音乐格式在哪里?
  5. 假如我是儿子——树形动态规划
  6. 你记得也好,最好你忘掉
  7. 据说是11年度最佳代码
  8. 大数据是什么?发展前景怎么样
  9. python 股票分析常用库_Python数据分析常用库有哪些?Python学习!
  10. HDU - 2033 人见人爱A+B