java实现基础数据类型中二进制位操作算法

虽然一直很头疼二进制的问题,主要是搞不清各种类型和补码啊之类的,可是发现用二进制位的操作算法解决一些算法题还是很方便的。。。。。

首先,(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补充。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值