虽然一直很头疼二进制的问题,主要是搞不清各种类型和补码啊之类的,可是发现用二进制位的操作算法解决一些算法题还是很方便的。。。。。
首先,(1)最经典的,交换两个整形变量,一般做法是借助第三个变量,但是用异或操作就是可以的,比如 a=0,b=5;java中异或用" ^ "表示;A异或B = (~A∩B)∪(~B∩A)
a=a^b; (a=1010^0011=1001)
b=a^b; (b=1001^0011=1010)
a=a^b; (a=1001^1010=0011 )
然后 (2)怎样把最低位1清零和怎样获取二进制表示中最低位1(可以计算指定数的二进制有多少的0)
即 x & (x-1)表示把最低位1清零 例如 x=0b1010110 执行完 x&(x-1)后 就变成了 0b1010100
x & !(x-1)表示获取x的最低位1 例如 x=0b1010110 , (x-1) =0b1010101, !(x-1) = 0b0101010,所以
x &!(x-1) = 0b0000010
(3)交换指定位置的数据位(可以实现二进制表现形式的倒转)
int swap(int x,int i,int j)
{ if((( x >> i ) &1) !=(( x >> j ) &1))
{x^=( 1 << i ) | ( 1 << j )
}
}
( x >> i ) &1表示获取二进制表示的第i位的值,( x >> j ) &1表示获取二进制表示的第j位的值,如果两个不相等的话再进行交换。
左移位:<<,有符号的移位操作
左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用0补充
右移位:>>,有符号的移位操作
右移操作是将运算数的二进制码整体右移指定位数,右移之后的空位用符号位补充,如果是正数用0补充,负数用1补充。