位运算作用,求个真的懂这个的来

基本原理我懂,但是一运算就弄不清楚了,比如 return (x&y)+((x^y)>>1); 为什么就能求平均~~~
百度复制粘贴的就别来凑热闹了。。。。真心求帮助

int f(int x,int y)
{
return (x&y)+((x^y)>>1);
};
f(729,271)=500.
解答:
x&y是取相同的位与,这个结果是x和y相同位,x^y是取x和y的不同位的和,右移1位,相当于除以2.所以结果是求x和y的平均数。

如果二进制不易理解,那我们看看十进制的情况。
假如将&操作和^操作推广到是取十进制位中来,即如果&操作对应的两个位上的数相同,则结果为两个数中的一个,否则为0.如2&2=2,2&3=0;如果^操作则留下两个数不同的那些位,234^136=204+106;
(以下的&和^都是上面假设推广到十进制中的运算符,而非二进制中的运算符)
现在如果设x=234,y=136,x&y=30,x^y=204+106,(x&y)+((x^y)/2)=30+(204+106)/2=185.
( (234+136) / 2 = ( 204+30+106+30) / 2 = 30 + (204+106) / 2 ).追问

还是理解不上去位运算的用法.....哭死了......有什么好的办法能理解位运算么?

还是理解不上去位运算的用法.....哭死了......有什么好的办法能理解位运算么?

追答

这个算是技巧,没理解也是可以的,看得懂就行

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-04-22
核心在于要时刻带着幂次的概念去理解。
可以这么理解:每一个数都可以写成2的幂次和的形式:
kn*2^n+kn-1*2+...+k2*2^2+k1*2+k0
以上kn,kn-1,...,k2,k1,k0只能为1或0.
实质也就是一个数的2进制表达形式:kn kn-1 ... k2 k1 k0 (ki只能在0、1中取值)
现在有2个数:a、b,我们都把它们的写成2的幂次和的形式:
a=∑ ki*2^i (i=0,1,2....n)
b=∑ kj*2^j (j=0,1,2....m)
以n、m中大的那个为基准,我们把a、b的同幂次项一一对应:
不妨设m>n,则有:
a=am*2^m+am-1*2^m-1+...+a2*2^2+a1*2+a0 (am,am-1,...,a2,a1,a0只能取0或1)
b=bm*2^m+bm-1*2^m-1+...+b2*2^2+b1*2+b0 (bm,bm-1,...,b2,b1,b0只能取0或1)
那么现在,如果我们要求a和b的平均,是不是就很清楚了:
(a+b)/2=(am+bm)/2 * 2^m + (am-1+bm-1)/2 *2^m-1 + ... + (a2+b2)/2 * 2^2 + (a1+b1)/2 * 2 + (a0+b0)/2
若 ai=bi (i=0,1,2,...,m),则 (ai+bi)/2=ai=bi,所以相同的位不变
若 ai≠bi,则ai+bi必为1(ai、bi必然一个为0,一个为1),则 (ai+bi)/2=1/2,不够除了,怎么办?从后面的幂次里面借一个过来,所以此时的 i 对应的幂次项 2^ki 需要往后移一位。
基本就是这样了。

位运算作用,求个真的懂这个的来
解答:x&y是取相同的位与,这个结果是x和y相同位,x^y是取x和y的不同位的和,右移1位,相当于除以2.所以结果是求x和y的平均数。如果二进制不易理解,那我们看看十进制的情况。假如将&操作和^操作推广到是取十进制位中来,即如果&操作对应的两个位上的数相同,则结果为两个数中的一个,否...

位运算符的作用是什么?
2、位运算符将数字视为二进制值,并按位进行相应运算,运算完成后再重新转换为数字。例如:表达式10&15表示(1010 & 1111),它将返回表示1010的值10。因为真真得真,或者是11得1,同位全是1结果也是1。表达式10|15表示(1010 | 1111),它将返回表示1111的值15。假假得假。全零得零。3、C语言中的...

位运算常见用法
即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。“异或运算”的特殊作用:(1)使特定位翻转找一个数,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或即可。例:X=10101110,使X低4位翻转,用X ^0000 1111 = 1010 0001即可得到。

以通俗的方式理解位运算 (以位运算加法为例)
​   至此,通过位运算完成加法计算已经说明完毕。我们可以发现位运算的作用真的就只是“在做标记”而已,是名副其实的“按位运算”。    至于减法涉及到了一些特别的技巧,乘法除法其实按本文理解了位运算的本质后也并不会很难用位运算去实现它,...

位运算,能不能一次记住!
位运算在计算机科学中扮演着重要角色,它们在底层数据处理、加密、优化算法等领域发挥着关键作用。本文将深入探讨位运算的基本概念、常见操作及其应用场景,帮助你理解计算机如何利用位操作来处理数据。首先,让我们了解二进制转换。计算机内部使用二进制系统进行数据处理,这基于其电子开关只有开和关两种状态。二...

c语言位运算符的用法
比特(Bit)是一个电子元器件,8个比特构成一个字节(Byte),它已经是粒度最小的可操作单元了。 C语言提供了六种位运算符: 按位与运算(&) 一个比特(Bit)位只有 0 和 1 两个取值,只有参与&运算的两个位都为 1 时,结果才为 1,否则为 0。例如1&1为 1,0&0为 0,1&0也为 0,这和逻辑运算符&&非常...

力扣让人抓耳挠腮的「位运算」 python3 实现
位运算包括7种运算符,它们在逻辑运算中发挥着重要作用。了解OR(或门)和XOR(异或门)的真值表,能帮助我们理解它们的异同。在异或运算中,如果两个数值相同则结果为0,不同则结果为1。异或门的特性尤其在题目中展现得淋漓尽致,为解决某些问题提供了巧妙的思路。力扣136题“只出现一次的数字”就是一...

计算机基础知识-第4章-真值表和逻辑运算、位运算
真值表和逻辑运算是理解计算机逻辑的基础。当我们考虑命题是否外出游玩,仅由加班和天气决定时,通过真值表明确地展示出这两个变量如何共同作用:不加班且晴天才出门。逻辑运算以开关为比喻,如与运算(串联开关,全开亮灯)、或运算(并联开关,至少一开亮灯)、非运算(开关短路,断开无灯)。位运算则是...

奇怪的知识——位掩码
明白了位掩码的作用以后,我们就可以通过它来对权限集二进制数进行操作了。1、查询用户是否拥有某个权限 已知用户权限集二进制数为permissionBinary = 0b0010。如果我想知道该用户是否存在 update 这个权限,可以先给定一个位掩码 mask = 0b1。由于update 位于右数第三项,所以只需要把位掩码向左移动...

C语言中c=a>>3是什么意思,>>好像是位运算符,请问有什么作用
>> 右移就是把这个数的末尾多少位去掉,如17>>3 表示 0001 0001 的最后3位去掉,就变成了 0000 0010 左移运算 左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。例如: a<<4 指把a的各二进位向...

相似回答