位运算和关于两个数交换的多种方法
我们知道。位运算在计算中有着广泛的应用。在计算机的各种编程语言中位运算也是一种不可缺少的运算。尤其是在计算机的底层实现代码中。
以下我们就来介绍一下位运算。
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了。很easy吧,这也是位运算在计算机中的应用之中的一个。
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,奇妙吧,慢慢领会就会了。