java 位运算实例_Java位运算经典实例

一 源码、反码、补码

正数的源码、反码、补码相同,例如5: 5的源码:101

5的反码:101

5的补码:101

负数的源码、反码、补码不同,例如-5: -5的源码:10000101

-5的反码:111111010 (取反操作)

-5的补码:111111011 (补码加1操作)

计算机所有数据都以补码存储和运算。

二 位操作

位操作包含&,|,!分别表示与,或非。

eg:

5 & 4 = 101 & 100 = 100(按位取“与”,1 & 1 = 1,0 & 1 = 0)

5 | 4 = 101 | 100 = 101  (按位取“或”,1 | 0 = 1, 0 | 0 = 0)

!5    = ! 101 = 010  (按位取“反”,!1  = 0, !0  = 1)

三 位运算实例

eg:给定一个有符号整数X(32位),写一个方法,检查这个数是否是4的N次方,N是非负整数。

下面是用Java解答这道题: public class Test {

public static void main(String[] args) {

for(int i = -64; i < 400; i+=1) {

if(isPowerOfFour5(i))

System.out.println("test "+ i + " is power of four!");

}

}

public static boolean isPowerOfFour1(int x) {

if(x == 0) return false;

while ((x % 4) == 0) {

x /= 4;

}

return x == 1;

}

public static boolean isPowerOfFour2(int x) {

if(x == 0) return false;

while ((x % 4) == 0) {

x >>= 2;

}

return x == 1;

}

public static boolean isPowerOfFour3(int x) {

double n = Math.log(x) / Math.log(4);

if(n -(int)n != 0) return false;

return n >= 0;

}

public static boolean isPowerOfFour4(int x) {

if(x == 0) return false;

int y = (int) Math.sqrt(x);

if(y * y == x)

return ((y & (y-1)) == 0);

return false;

}

public static boolean isPowerOfFour5(int x) {

if(x == 0) return false;

return (x & (x - 1)) == 0 && (x & 0xAAAAAAAA) == 0;

}

}

稍微解释一下,第一个方法的算法复杂度是log4X,原理是,凡是4的N次方的数(N是大于等于0的正整数),则对X一直取余,最终结果肯定等于1,比如4 * 4 * 4 = 64。

第二个方法和第一个方法原理一样,>>2相当于/4。

第三个方法利用公式:4N = X  => N = log4X = logX / log4,所以只需要判断N大于等于0且为整数即可(如果n-(int)n != 0表明n不是整数)。

第四个方法的原理如下: 40     41   42    43…  4n

(22)0 (22)1 (22)2 (22)3… (22)n 则y = Math.sqrt(x)等于:

20   21    22    23…  2n 所以我们只需要判断y是整数,且y是2的n次方,n大于等于0且为整数:

判断一个整数y是不是2的n次方,只需要判断y&(y-1)等不等于0即可。

第五种方法的原理如下: 40                        1

41                   100

42              10000

43        1000000

4n    100000000… 可以发现,所有以4为底的N次方的数的2进制都只有1位为1,且为1的这一位在奇数位上。

因此,我们首先判断X的2进制只有一位,且该位不在偶数位上,还要注意0必须除外,因为0&任何数都等于0。

前面说过,x & (x - 1) == 0则表明x是2的n次方,我们应该知道任何2进制只有一位为1的数都可以表示为2的n次方。

既然已经确定x的2进制数只有一位为1,那么(x & 0xAAAAAAAA) == 0表明为1的这一位在奇数位上,因为0xAAAAAAAA = 1010 1010 1010 1010

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值