在一个数据库中,有一个字段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,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='普通设备',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,但不知道如何分解值到对应的编码。
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
-- 也可以直接求, 你测试一下哪种方法快,这种方法循环过程多点,但#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
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
*/