美文网首页
每日一面 - 求与数字最接近的 2 的 N 次方

每日一面 - 求与数字最接近的 2 的 N 次方

作者: 干货满满张哈希 | 来源:发表于2021-01-23 07:41 被阅读0次

对于 2 的 N 次方取余,相当于对 2 的 N 次方减一取与运算,这对于高并发分片计算的时候,很有用。为了对用户友好,我们让用户设置分片数量的时候可能不限制必须是 2 的 N 次方,但是内部我们设置分片的时候,将其设置为最近用户输入数字的 2 的 N 次方的值即可。那么如何计算呢?

抽象为比较直观的理解就是,找一个数字最左边的 1 的左边一个 1 (大于 N 的最小的 2 的 N 次方),或者是最左边的1(小于N的最大的2的N次方),前提是这个数字本身不是2的n次方。

image

那么,如何找呢?一种思路是,将这个数字最高位 1 之后的所有位都填上 1,最后加一,就是大于N的最小的 2 的 N 次方。右移一位,就是小于N的最大的 2 的N次方。

如何填补呢?可以考虑按位或计算,我们知道除了 0 或 0=0 以外,其他的都是 1. 我们现在有了最左面的 1,右移一位,与原来按位或,就至少有了两位是 1,再右移两位并按位或,则至少有四位为 1。。。以此类推:

image

用代码表示是:

n |= n >>> 1; 
n |= n >>> 2; 
n |= n >>> 4; 
n |= n >>> 8; 
n |= n >>> 16;
n += 1;  //大于N的最小的2的N次方
n = n >>> 1; //小于N的最大的2的N次方

如果有兴趣,可以看一下 Java 的 ForkJoinPool 类的构造器,其中的 WorkQueue 大小,就是通过这样的转换得来的。

相关文章

  • 每日一面 - 求与数字最接近的 2 的 N 次方

    对于 2 的 N 次方取余,相当于对 2 的 N 次方减一取与运算,这对于高并发分片计算的时候,很有用。为了对用户...

  • Day4-作业

    读程序,总结程序的功能: 答:本题输出结果为2的20次方,其功能是求2的n次方(n=1~20) 改正:功能是求2的...

  • 数组求2的n次方

    数据范围n<=10000;

  • 【JS】小作业数学运算

    1.求2的n次方,n为输入 varn=parseInt(window.prompt('input')); vars...

  • C语言求2的n次方

    C语言求2的n次方。计算机整数的范围最大是 0~2^64-1。如果计算2的100次方,使用浮点数将损失结果的精度。...

  • RSA-Pycrypto

    RSA 密码算法与签名RSA是一种公钥密码算法,RSA的密文是对代码明文的数字的 E 次方求mod N 的结果。也...

  • 关于算法的时间复杂度的排序

    O(1)

  • python函数2.0

    一、函数的参数 1、位置参数(一般未知数) def power(x,n): 求x的n次方 2、默认参数 将某个参数...

  • C++使用按位左移_右移运算符

    1.按位右移运算符(>>)将数据除以2^n(2的n次方) 2.按位左移运算符(<<)将数据乘以2^n(2的n次方)...

  • 求阶乘之和

    1.题目描述求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。 2.格式与样例...

网友评论

      本文标题:每日一面 - 求与数字最接近的 2 的 N 次方

      本文链接:https://www.haomeiwen.com/subject/dqyyzktx.html