当前位置: 首页 > news >正文

给定一个非负整数num,如何不用循环语句,返回>=num,并且离num最近的,2的某次方

题目描述

给定一个非负整数num,如何不用循环语句,返回>=num,并且离num最近的,2的某次方

题目分析

假设有一个数n,它的二进制位表示如下:

0100,0000

那么n = n ∣ ( n > > 1 ) ,得到如下:

0110,0000
那么n = n ∣ ( n > > 2 ) ,得到如下:
0111,1000
那么n = n ∣ ( n > > 4 ) ,得到如下:
0111,1111

因此,下面代码的意思是:

        n |= n >> 1;
        n |= n >> 2;
        n |= n >> 4;
        n |= n >> 8;
        n |= n >> 16;

对于数temp,它的二进制表示从最高位的1开始全部变1
为什么只需要算到16,因为整型只有32位。
如果是long类型,那么多一个 n|= n>> 32;即可
举个例子:
如果 n = 13 ,那么它的二进制是:

0000,1101

然后x = n - 1,x的二进制为:

0000,1100
然后对x进行或操作,将最高位开始全部变1,得到y=
0000,1101
然后对y+1,得到ans =
0001,0000

举个例子:
如果 n = 16,那么它的二进制是:

0001,0000
然后x = n - 1,x的二进制为:
0000,1111
(这也是为啥要减1的原因)

然后对x进行或操作,将最高位开始全部变1,得到y=

0000,1111
然后对y+1,得到ans =
0001,0000

代码实现

public class Near2Power {
    public static int tableSizeFor(int n) {
        n--;
        n |= n >> 1;
        n |= n >> 2;
        n |= n >> 4;
        n |= n >> 8;
        n |= n >> 16;
        return (n<0)?-1:(n+1);
    }

    public static void main(String[] args) {
        int cap = 120;
        System.out.println(tableSizeFor(cap));
    }

}

相关文章:

  • 如何做网站搜索引擎优化/怎么优化整站
  • php可以做视频网站/市场营销策划ppt
  • 青岛响应式网站建设/友情链接推广
  • 中信建设有限责任公司招标公告/seo网站优化软件价格
  • 网站网站优化/当前疫情十大热点
  • o2o电子商务网站建设/北京网站优化校学费
  • Linux (open、write、read、close、lseek、chmod、sync)操作文件的函数详解
  • Linux系统信息查看命令大全
  • Kotlin~软件开发7大原则
  • Ajax的学习笔记(包括原生的ajax,jquery,axios,fetch)
  • Spring Cloud OpenFeign 配置
  • 语义分割——FCN模型pytorch实现
  • 规划之路:SLAM学习经验分享
  • InfluxDB + Grafana计算成功率
  • 数组常用方法总结 (6) :includes / indexOf / lastIndexOf / valueOf / toString / isArray
  • 代码随想录算法训练营第十八天二叉树 java : .106 从中序与后序遍历序列构造二叉树113. 路径总和ii 112 路径总和 513.找树左下角的值
  • MySQL进阶——存储引擎
  • npm的相关知识