找出不小于给定数字的最小2的幂值

2017/3/13 12:59:41



看JDK源码,在HashMap类中发现了一个可以很好解决这个问题的方法。

问题描述:

假设给定 14,输出16;给定16,也输出16;给定17,输出32。输出满足给定数字的最小2的幂值

算法:

  1. int tableSizeFor(int cap) {
  2. int n = cap - 1;
  3. n |= n >>> 1; # 001XXXXX --> 0011XXXX
  4. n |= n >>> 2; # 0011XXXX --> 001111XX
  5. n |= n >>> 4; # 001111XX --> 00111111
  6. n |= n >>> 8; # 00111111 --> 00111111 不再变化
  7. n |= n >>> 16;# 00111111 --> 00111111 不再变化,因为最大就是32位,所以到此结束
  8. return n + 1;
  9. }

解析:

思路是填充1,比如 000110101,此时想要把高位第四位的1右边的所有值都填充为1,然后+1就得到满足目标的值。

但是需要注意如果本来这个数字就是2的幂,结果就会是原来数字的2倍,所以开始前先cap-1。

时间: 2024-08-06 11:58:30

找出不小于给定数字的最小2的幂值的相关文章

LeetCode:Consecutive Numbers - 找出连续出现的数字

1.题目名称 Consecutive Numbers(找出连续出现的数字) 2.题目地址 https://leetcode.com/problems/consecutive-numbers/ 3.题目内容 写一个SQL,查出表Logs中连续出现至少3次的数字: +----+-----+ | Id | Num | +----+-----+ | 1  |  1  | | 2  |  1  | | 3  |  1  | | 4  |  2  | | 5  |  1  | | 6  |  2  | | 

剑指Offer36 数组所有数字出现两次,只有两个出现了一次,找出这两个数字

1 /************************************************************************* 2 > File Name: 38_NumbersAppearOnce.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月03日 星期六 10时50分32秒 6 *******************************

C语言实现一个int类型数组里除了两个数字之外,其他的数字都出现了两次,找出这两个数字

题目是这样叙述的:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字. 要求:时间复杂度为O(N),空间复杂度为O(1). 请看我的分析:将这道题简单化:一个数组中只有一个数字出现一次,其他数字都是成对出现的,这时我们可以根据异或运算符的特性:A^B^A = B; 0 ^ A = A:我们可以将这个数组的全部元素依次做异或运算,最终结果就是那个只出现一次的数字.不会的可看本人(2019-04-04)那天的博客 如果这个数组中出现两个不同的数字,而其他数字均出现两次

找出数组中从未出现的最小正整数java实现

1 /** 2 * 找出未出现的最小正整数 3 * @param A 4 * @param n 5 * @date 2016-10-7 6 * @author shaobn 7 */ 8 public static int findArrayMex(int[] a,int n){ 9 int count = n; 10 int temp = 0; 11 int dir = 1; 12 int num = 0; 13 for(int i = 0;i<count-1;i++){ 14 if(a[i]

一组成对的数字,找出不成对的数字

题面描述 有一个卡组,卡组中所有不同的卡牌都有两张.不小心遗失了一张,找出遗失的是哪张卡牌. 输入数据 输入数据的第一行为一个整数 T(1 <= T <= 10) ,表示有 T 组测试数据.每组数据的第一行为一个整数 n(2 <= n <=100000) , n 为偶数,表示一个卡组中卡牌的数量.接下来的一行有 n - 1 个整数,为剩余牌的编号,其中相同牌的编号相同,不同牌的编号不同. 输出数据 对于每组数据,在单独的一行中输出结果,为滑落牌的编号,格式见样例. 样例输入 221

Fcc找出能被给定的两个参数和参数之间所有连续数字整除的最小公倍数。

原题代码如下: function smallestCommons(arr) { return arr; } smallestCommons([1,5]); 最小公倍数的参考资料:https://www.mathsisfun.com/least-common-multiple.html. 因为参数不一定是从小到大排序的,所以需要先对参数做一个排序: arr=arr.sort(); 然后需要了解到的是如何求最小公倍数, 通过查询资料了解到最小公倍数的求法,A,B两个数的最小公倍数公式:A*B/gcd

15. 3Sum_左右开工,遍历找出符合目标的数字

题目: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: The solution set must not contain duplicate triplets. For example, given array S = [

【SQLSERVER】如何找出字符串中的数字

可以通过写自定义函数实现,以下提供两种思路来解决: 1.通过正则匹配,找到字符串中的数字,一个一个拼起来 /*方法一: 一个一个找出来*/ CREATE FUNCTION [dbo].[Fun_GetNumPart] ( @Str NVARCHAR(MAX) ) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @Start INT; DECLARE @End INT; DECLARE @Part NVARCHAR(MAX) SET @Start = PATINDEX

面试题:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字

由于有一个数字消失了,那必定有一个数只出现一次而且其它数字都出现了偶数次.用搜索来做就没必要了,利用异或运算的两个特性—— 1.自己与自己异或结果为0 2.异或满足交换律. 因此我们将这些数字全异或一遍,结果就一定是那个仅出现一个的那个数. 示例代码如下: int[] arra = {11,12,3,12,11,12,12 }; static void Main(string[] args) { int[] arra = {11,12,3,12,11,12,12 }; int lostNum =