(xy) + ( (x^y)>>1 )
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 )相关推荐
- List<Map<String, Object>>——多层嵌套的数据结构
文章目录 快速理解多重嵌套结构 Map基础知识 List 例子 查询数据库 快速理解多重嵌套结构 对于多层嵌套的数据结构,需要层层分解. 以List<Map<String, Object& ...
- Houdini流体>>粒子流体导出到unity笔记
Houdini流体>>Houdini流体导出到unity笔记 一.参考资料: 1.unity中流体案例项目连接:(可选HDRP 和URP管线) https://github.com/kei ...
- 碟评--梁紫丹新碟<<紫色的声音>>
今天朋友说子弹终于出新碟了,忽然觉得原来记忆里还有这个小MM,听说之前去日本学习去了,留过洋水归来,终于出碟了, 实在值得高兴,于是去下载试听之( http://www.verycd.com/topi ...
- 运算符“||”与“|”,“”和“”的区别 (附带各类位运算符号详解(、|、^、~、<<、>>、>>>)
区别一: 定义不同: || 和 | 都是表示"或",区别是||只要满足第一个条件,后面的条件就不再判断,而|要对所有的条件进行判断. 区别二: 与操作和或操作的区别 (1)在Jav ...
- Linux中>>和>,>和<的区别? 以及“|”是什么意思?
Linux中>>和>, >和<的区别? 以及"|"是什么意思? 一.Linux 中>>和>的区别 ? 1.>>和& ...
- SAP-FI章<<<<第三节:添加税码设置>>>>添加税码的特殊传输方式:100配置传输至800
SAP-FI章<<<<第三节:添加税码设置>>>> 使用背景,FTXP添加税码的特殊传输方式:100配置传输至800** 说明:系统适用版本S4CORE ...
- <<飞 鸟 集>>--泰戈尔
夏天的飞鸟,飞到我的窗前唱歌,又飞去了. 秋天的黄叶,它们没有什么可唱,只叹息一声,飞落在那里. Stray birds of summer come to my window to sing and ...
- Java面试汇总>>>初级工程师—面试1000题
面试汇总>>> 每日刷题 001:重载和重写有什么区别?阐述二者是什么? 002:什么是线程池?线程池有什么优点? 003:线程有几种状态,他们是怎么切换的呢? 004:比较一下St ...
- Linux 中echo及echo > 和echo >>
一.Linux 中的echo指令 Shell 的 echo 指令用于字符串的输出.详见: Shell echo命令 | 菜鸟教程 二.echo > 和echo >> echo > ...
- 深度(穿透)选择器 >>> /deep/ ::v-deep
深度(穿透)选择器 ::v-deep /deep/ 及 >>> 在 vue 项目的开发过程,使用了 ElementUI 组件且样式 style 使用了 scoped 属性,当想要修改 ...
最新文章
- Python+OpenCV 图像处理系列(5)—— 图像 ROI 操作及通道的拆分合并
- c++中的基本知识点
- 今年两会大火的新基建,平均企业月薪1.63万 | 2020新基建中高端人才市场就业吸引力报告...
- J2EE的13种核心技术
- 使用Silverlight for Embedded开发绚丽的界面(4)
- 原文翻译:深度学习测试题(L1 W1 测试题)
- 使用sphinx搜索子域名过程中需注意的问题
- EasyUI datagrid 分页保持选中状态
- Ubuntu14.04 kylin 安装配置Tomcat7服务器
- 字符串的获取相关方法
- linux mysql清除缓存_转载-清除Linux中MySQL的使用痕迹~/.mysql_history
- 理解asp.net中DropDownList编辑数据源,绑定数据库数据。
- 程序员应该具备哪些素质
- 查看redis安装路径
- 无公式搞懂GMSK调制原理,附详细注释的matlab GMSK调制解调原理仿真源码
- 群英荟萃 | UINO优锘科技ThingJS平台亮相华为开发者大会
- 显卡是什么?显卡和Graphics的区别在哪里?
- 手机坏了,有必要再修吗?
- 成为一名合格的软件测试工程师,需要具备哪些技能?
- 用Python助女神发朋友圈