在MySQL查询中将值舍入为最接近的2的幂

时间:2014-04-28 12:03:49

标签: mysql sql

我想在mysql查询中将值舍入到下一个最接近的2的幂,所以

select RoundUpToNearestPowerOfTwo(700) -- Should give 1024

我需要这个解决方案作为更大的查询的一部分来生成和读取一些位掩码。使用自定义存储函数不是一种选择,因为我不能在生产环境中使用它们,所以我正在寻找一种在查询中内联的智能方法。

[编辑] 我能想到的一种可能的方法是创建一些枚举器,使用其中的幂,并选择大于我的值的最小值:

  select
    min(BOUND)
  from
    (select 700 as VALUE) v
    inner join
      (select
        POW(2, @pow := @pow + 1) as BOUND
      from
        (select @pow := 0) x,
        MY_RANDOM_TABLE t
      ) x on x.BOUND > v.VALUE

但正如你所知,它非常冗长,所以我们欢迎更精简的解决方案。

3 个答案:

答案 0 :(得分:10)

试试这个。

FLOOR(POW(2,CEIL(LOG2(1025))))

CEIL和FLOOR正确处理边界条件。

答案 1 :(得分:4)

试试这个:

select power(2, 1 + floor(log2(XXX)))

MySQL方便地具有log2()功能,它完成了大部分工作。

编辑:

我认为这可能是你想要的:

select (case when floor(log2(XXX)) <> log2(XXX)
             then power(2, 1 + floor(log2(XXX)))
             else power(2, floor(log2(XXX)))
        end)

或类似的东西:

select power(2, 1 + floor(log2(XXX*0.999999)))

2的实际权力存在边界条件。

答案 2 :(得分:0)

如果你正在使用SQL Server,那么你可以尝试这个...只需在变量@value中更改任何值的值,以获得下一个最接近的2的幂

declare @count int = 1
declare @value int = 700
while (@value <> 1)
BEGIN
    set @value = @value / 2
    set @count = @count + 1
END
select power(2, @count)