在一个数据库中,有一个字段LB的值是通过下面方法取得的:
1、先定义好一个编码值系列,如:1,2,3,4,5,6,7,8......16,17
2、然后通过 select lb1=power(2,1)/2,lb2=power(2,2)/2,lb16=power(2,16)/2,lb17=power(2,17)/2
反过来求单个指数是:
declare   @mi int,@gen   int,@count   int 
select   @mi   =   65536*2,@gen=2,@count=0 
while(@mi <> @gen) 
begin 
set   @count=@count+1 
set   @mi=@mi/@gen
end 
print   @count+1值等于17
3、求任意值相加后如何分解的问题,比如lb1=power(2,1)/2=1,lb16=power(2,16)/2=32768,lb17=power(2,17)/2=65536,
   假如 lb1+lb16+lb17=98305,现在我知道值98305,如何求有几个个数相加的?其值分别是什么?比如lb1=?,lb16=?,lb17=?

解决方案 »

  1.   

    不是我想什么目的和意义,是用友公司的一个数据库的数据集合表示方法,我现在维护这个并打算做二次开发。
    1、先定义好一个编码值系列,如:1='普通设备',2=‘大型设备’,3=‘精密设备’,4=‘进口设备’,5=‘国产设备’,6=‘自行询价采购设备’,7=‘邀请招标设备’,8=‘代理招标设备’......16=‘实验室设备’,17=‘报废设备’
    2、然后通过 select lb1=power(2,1)/2,lb2=power(2,2)/2,lb16=power(2,16)/2,lb17=power(2,17)/2
    反过来求单个指数是:(同上)
    3、求任意值相加后如何分解的问题,比如lb1=power(2,1)/2=1,lb16=power(2,16)/2=32768,lb17=power(2,17)/2=65536,比如:1+16+17,相当于同时选'普通设备'、‘实验室设备’、‘报废设备’的意思,但是存储到字段lb的值是1+32768+65536=98305,现在我通过查询知道LB的值等于98305,但不知道如何分解值到对应的编码。
      

  2.   

    set nocount onif object_id('tempdb.dbo.#') is not null drop table #
    select top 63 n = identity(int,0,1), bmp = convert(bigint, null) into # from syscolumns
    update # set bmp = power(convert(bigint,2), n)
    -- 创建一个这样的静态表-- 计算过程
    declare @i bigint, @n int
    set @i = 98305while @i > 0
    begin
        select @n = max(n) from # where bmp<=@i
        select @i = @i - bmp from # where n = @n
        print ltrim(@n+1)
    end/*
    17
    16
    1
    */set nocount off
      

  3.   


    -- 也可以直接求, 你测试一下哪种方法快,这种方法循环过程多点,但#6的方法要查表
    declare @i bigint, @n int
    select @i = 98305, @n = 1
    while @i>0
    begin
        if @i%2 = 1 print @n
        set @i = @i/2
        set @n = @n+1
    end
      

  4.   

    if object_id('tempdb.dbo.#') is not null drop table #
    select top 63 n = identity(int,0,1), bmp = convert(bigint, null) into # from syscolumns
    update # set bmp = power(convert(bigint,2), n)
    -- 创建一个这样的静态表,这个表是有必要的,有了这个表,关联查询很方便。
    -- 看完球赛回来灵感爆发
    declare @i bigint
    set @i = 98305
    select sn=n+1 , * from # where bmp & @i > 0
    /*
    sn          n           bmp
    ----------- ----------- --------------------
    1           0           1
    16          15          32768
    17          16          65536
    */
      

  5.   

    SQLCenter辛苦了,看了你的算法,真是佩服。