整数x的二进制表示有多少位1 以及 判断质数

判断质数

普通方法

private boolean isPrime(int x) {
        if (x < 2) {
            return false;
        }
        for (int i = 2; i * i <= x; ++i) {
            if (x % i == 0) {
                return false;
            }
        }
        return true;
    }

巧妙的方法
今天做的这个题有点特殊,该题中出现的质数绝对不会超过20,而不超过20的质数只有:2,3,5,7,11,13,17,19。

可以用一个 m a s k = 665772 = 1010001010001010110 0 2 mask=665772=10100010100010101100_2 mask=665772=101000101000101011002来存储这些质数,其中mask 二进制的从低到高的第 i 位为 1 表示 i 是质数,为 0 表示 i 不是质数。

设整数 x 的二进制中 1 的个数为 c,若mask 按位与 2 c 2^c 2c不为 0,则说明 c 是一个质数。

2 c 2^c 2c可以用1 << Integer.bitCount(x)表示,此时,若((1 << Integer.bitCount(x)) & 665772) != 0则c为质数。

整数x的二进制表示有多少位1

java库函数

Integer.bitCount(x)

x&=x-1

x&=x-1可以消除x最低位的1,while循环计数,直到x=0即可。

x的最低位一定是/1[0]*/。如果x的低位是10000,则x-1的低位是01111,x&=x-1则可以消除掉最低位的1。如此循环,直到x=0,则可以统计出x的二进制表示中1的位数

lowbit
举个例子: l o w b i t ( 6 ) = 2 lowbit(6)=2 lowbit(6)=2,lowbit运算就是x&=-x,这样运算完后,只会保留x最低位的1。

例如,x为1000 1010,则-x为0111 0110
注意,计算机中负数的表示方法是取反+1

x--		1000 1010
x取反-	0111 0101
再+1--	0111 0110

x&-x只会保留x最低位的1。这种方式的原理其实和x&=x-1有异曲同工之妙。
x的低位一定是10000这样的形式,则x取反的低位是01111,x取反+1的低位是10000。所以x和-x的最低位的1以及之后的所有位都是相等的,而之前的位都是相反的,所以两者按位与只会保留最低位的1。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷冰殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值