黑马程序员技术交流社区
标题:
换位运算怎么回事
[打印本页]
作者:
燕雀不知
时间:
2015-7-9 00:05
标题:
换位运算怎么回事
如题
作者:
bug陈
时间:
2015-7-9 00:05
位就是二进制的位,
位运算有6个运算符:<<左移 >>右移 >>>无符号右移 &与运算 |或运算 ^异或运算 ~反码
<<左移 空位补0,被移除的高位丢弃,空缺位补0。
相当于乘以2的倍数;移n位,就是乘以2的n次幂。
>>右移 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,空缺位补1。
相当于除以2的倍数;移n位,就是除以2的n次幂。
>>>无符号右移 被移位二进制最高位无论是0或者是1,空缺位都用0补。
&与运算 二进制位进行&运算,只有1&1时结果是1,否则是0;
|或运算 二进制位进行 | 运算,只有0 | 0时结果是0,否则是1;
^异或运算 任何相同二进制位进行 ^ 运算,结果是0; 1^1=0 , 0^0=0
不相同二进制位 ^ 运算结果是1。 1^0=1 , 0^1=1
~反码 二进制取反,1变0,0变1
作者:
yongaidongbing
时间:
2015-7-9 00:25
亲,你说的是移位运算吧?移位运算符就是在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。
作者:
秀丽xl
时间:
2015-7-9 07:53
你说的是交换位置的运算么?也就是二进制的移位运算。移位运算有三种,分别是左移、右移、无符号右移。<< 左移 左边高位舍弃,右边空白部分补齐0。 >> 右移 如果最高位是0,左边被移空部分补0,如果最高位是1,左移空白部分补齐1。 >>> 无符号右移,不管移出位是什么,空白处均用0补齐。希望对你有帮助
作者:
_真的小迷糊
时间:
2015-7-9 08:14
1.左移运算<< 左移右移都是移动二进制数
0000-0000 0000-0000 0000-0000 0000-1100 =12 向左移动一位变为(右边缺几位就补几个0)
0000-0000 0000-0000 0000-0000 0001 1000 =24 再向左移一位
0000-0000 0000-0000 0000-0000 0011 0000 =48
由此,我们可以得到,其实m向左移n位后,m=m*2^n;即每向左移一位,该数就会增到一倍。
2.右移运算和左移运算类似,但是也有一个区别。
0000-0000 0000-0000 0000-0000 0000-1100 =12 向右移一位
0000-0000 0000-0000 0000-0000 0000-0110 =6再向右移一位
0000-0000 0000-0000 0000-0000 0000-0011 =3再向右移动一位
0000-0000 0000-0000 0000-0000 0000-0001 =1
我们也可以得到一个规律,每向右移动一位,该数就会减小一倍(按计算机的整数规律减小)
>>向右移动的过程中,左边是补0还是1,是根据原来的数的最高位来确定的,原来数的最高位是1,则补1,否则补0
>>> 向右移动的过程中,不管原来数的最高位是1还是0,都补0,所以我们应该根据需要来选择,右移是用>>>还是>>.
3.&与运算
与运算同样都是对二进制位来说的。比如14&7=2(省略了前面的二进制位)
1010
&0111
----------------
0010
4.|或运算 与与运算类似(略)
5.~运算也都差不多
6.^异或运算,我们主要看一下异或运算 12^7=11
1100
^0111
--------------------------
1011
异或运算就是两个数不相同则为1,相同则为0。
7.我们讲一下在计算机中是怎样将二进制转化为16进制的
0000-0000 0000-0000 0000-0000 0010-1011
我们都知道,只要将每四位一取,然后对每一项算出它的16进制,然后再合起来就是2进制的16进制的表现形式
上面的数据应该是 2 11
那计算机是怎样算的呢?这儿就是用&运算来完成的,
首先,将上数进行下面的与运算
0000-0000 0000-0000 0000-0000 0010-1011
&0000-0000 0000-0000 0000-0000 0000-1111
---------------------------------------------------------------------
0000-0000 0000-0000 0000-0000 0000-1011
这样,我们就把上面的数据的最后四位二进制位取出来了,然后进行计算就得到16进制的值
如果我们要把倒数的第二个四位二进制位取出来,那又该怎么取呢?
我们只需要把该书向右移四位,然后再取就ok了。非常简单吧,这也是位运算在计算机中的应用之一。
8.接下来我们讲一下,用位运算怎么交换两个数
int a=8,b=2;
最普通的方法:int temp=a,a=b,b=temp,最简单最常用的,不多说。
稍微高级一点的:a=a+b
b=a-b
a=a-b
再高级一点的位运算:a=a^b
b=a^b
a=a^b
这是为什么?
因为异或运算有一个特点,如下10^8=2
1010
^1000
------------
0010
但是10^8^8=???? =10
0010
^ 1000
-------------
1010
也就是说,n^m^m=n,神奇吧,慢慢领会就会了。
作者:
zhwfa1991
时间:
2015-7-9 12:52
移位运算就是把数字换算成二进制后进行的左移右移,然后用0补全之后所得到的数值
作者:
huguozhang
时间:
2015-7-9 16:27
我这里有个demo 你看下 求点分~~
/*
运算符:
运算符用来连接操作数,组成有意义的式子
分类:
算是 关系 逻辑 位运算
位运算:
用于整数的二进制位之间的运算
& 按位与:如果两个位进行&操作,同1则结果为1,有0结果就为0
任何数和1进行&操作,得到这个数的最低位(以此可知,可通过最低位判断该数奇偶性,1为奇,0为偶)
| 按位或:如果两个位进行&操作,有1则结果为1,同0结果就为0
~ 按位取反:1变0,0变1
^ 按位异或:相同为0,不同为1
<< 左移位: 左侧、高位移动出去的位就丢了,低位开始补0
记忆的技巧:x向左移动n位,相当于x*(2^n) (原数乘以2的n次方)
>>右移位: 移除去的部分舍弃,高位补符号位(右移不会改变一个数的正负性)
记忆的技巧:x向右移n位,值等于 x/(2^n)的整数部分 (原数除以2的n次方,结果取整)
&: 9 & 8
00000000000000000000000000001001
&00000000000000000000000000001000
----------------------------------------------
00000000000000000000000000001000
|: 9 | 8
00000000000000000000000000001001
|00000000000000000000000000001000
----------------------------------------------
00000000000000000000000000001001
~: ~9;
00000000000000000000000000001001
~
----------------------------------------------
11111111111111111111111111110110 补(最高位1为补码要转为原码)
10000000000000000000000000001001 反
10000000000000000000000000001010 原 -10
^ 9^8
00000000000000000000000000001001
^00000000000000000000000000001000
--------------------------------------------
00000000000000000000000000000001
<< 8<<2 ==32
00000000000000000000000000001000
<<2 00000000000000000000000000100000 :32
*/
void opintionS(){
//按位与
int result = 9&8 ;
// 按位或
result = 9|8;
// 按位取反
result = ~9;
// 9异或8
result = 9^8;
printf("result=%d\n",result);
}
作者:
wx_HWRW5aF7
时间:
2015-7-9 20:33
位运算是以二进制补码的形式进行的
作者:
孟卫严
时间:
2015-7-9 21:55
本帖最后由 孟卫严 于 2015-7-9 21:58 编辑
位运算是考虑在机器中运算比较高效
如 <<左移运算符
>>右移运算符
>>>无符号右移,又叫绝对右移
他们主要涉及到二进制,如果你知道二进制就很简单
如果你不知道,建议你先看看数字的二进制表示
只要记住机器里面的运算都是 补码
而显示的都是 原码
这个关键点就一点都不迷
作者:
xiaoqiao
时间:
2015-7-10 11:41
位运算符
& 按位与 : 有0则0, 全1才1
| 按位或 : 有1则1, 全0才0
^ 按位异或 : 相同为0, 不同为1
~ 按位取反 : 所有的1变0, 0变1
^ : 一个数据对同一个数据^两次,结果还是数据本身。
举例:a ^ b ^ b = a
左移 << -- 高位舍弃,右侧补0, 相当于乘以2的指定次幂
右移 >> -- 高位是1补1,高位是0补0, 低位舍弃, 相当于除以2的指定次幂
无符号右移 >>> --高位补0,低位舍弃.
如果一个数快接近int所能表达的最大值,那么左移就会溢出
作者:
徐鹏辰
时间:
2015-7-11 17:03
本帖最后由 徐鹏辰 于 2015-7-11 17:10 编辑
位就是二进制的位,
位运算有6个运算符:<<左移 >>右移 >>>无符号右移 &与运算 |或运算 ^异或运算 ~反码
<<左移 空位补0,被移除的高位丢弃,空缺位补0。
相当于乘以2的倍数;移n位,就是乘以2的n次幂。
>>右移 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,空缺位补1。
相当于除以2的倍数;移n位,就是除以2的n次幂。
>>>无符号右移 被移位二进制最高位无论是0或者是1,空缺位都用0补。
&与运算 二进制位进行&运算,只有1&1时结果是1,否则是0;
|或运算 二进制位进行 | 运算,只有0 | 0时结果是0,否则是1;
^异或运算 任何相同二进制位进行 ^ 运算,结果是0; 1^1=0 , 0^0=0
不相同二进制位 ^ 运算结果是1。 1^0=1 , 0^1=1
~反码 二进制取反,1变0,0变1
规律:&有假则假;|有真则真;^同假异真。(1—真,0—假)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2