java 数字在范围内_Java在数字范围内计数一位

我在大范围内计数一位时遇到问题.

所以我必须在1到1000的eq数范围内计算一位

是4938.

public static long countRangeOneBits(long n){

long t = 0;

for (long i = 1; i <= n; i++) {

long x = i;

while (x > 0) {

t += x%2;

x /= 2;

}

}

return t;

}

好的,这工作正常,但我需要计算范围1..10 ^ 16.首先,java不会计算这么大的数字,至少对于长数据类型而言.我还有其他选择吗,或者你们对我应该如何解决此问题有任何提示.

| From 1 To | Total |

| 1 | 1 |

| 10 | 14 |

| 100 | 319 |

| 1000 | 4938 |

| 10000 | 64613 |

| 100000 | 815030 |

| 1000000 | 9884999 |

| 10000000 | 114434632 |

| 100000000 | 1314447116 |

| 1000000000 | 14846928141 |

| 100000000000000 | 2306412649693200 |

| 1000000000000000 |24784747400675300 |

解决方法:

我猜你需要玩2 ^ n.从0到(2 ^ n-1)的1位总数= n * 2 ^(n-1).

而在程序中,这就是您想要的

private static long getBits(long l){

if(l == 0){

return 0;

}else if(l == 1){

return 1;

}

boolean isPowerOf2Minus1 = (l & (l+1)) == 0;

long maxBitNum = Long.highestOneBit(isPowerOf2Minus1 ? l+1 : l);

int maxBit = Long.numberOfTrailingZeros(maxBitNum);

if((l & (l+1)) == 0){

return maxBit * (maxBitNum >> 1);

}

long diff = l - maxBitNum;

return diff + 1 + getBits(maxBitNum - 1) + getBits(diff);

}

结果如下

1 : 1

10 : 17

100 : 319

1000 : 4938

10000 : 64613

100000 : 815030

1000000 : 9884999

10000000 : 114434632

100000000 : 1314447116

1000000000 : 14846928141

10000000000 : 164293127179

100000000000 : 1809725656079

1000000000000 : 19809942118413

10000000000000 : 214309466746894

100000000000000 : 2306412649693201

1000000000000000 : 24784747400675348

10000000000000000 : 264286863212871700

100000000000000000 : 2804216299269586964

标签:bit,binary,java

来源: https://codeday.me/bug/20191122/2058717.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值