Heim  >  Artikel  >  Datenbank  >  SQLServer逻辑位运算示例

SQLServer逻辑位运算示例

WBOY
WBOYOriginal
2016-06-07 14:56:071703Durchsuche

一、场景: 在某些场景中,需要保存一系列的bit型。为了简化数据库结构或其它特殊的要求,可以将8个bit型保存为1个byte中(例如,tinyint型)。 二、逻辑位运算函数: (1) “逻辑位与”。 当且仅当输入表达式中两个位(正在被解析的当前位)的值都为 1 时

一、场景:

  在某些场景中,需要保存一系列的bit型。为了简化数据库结构或其它特殊的要求,可以将8个bit型保存为1个byte中(例如,tinyint型)。


二、逻辑位运算函数:

(1) “逻辑位与”。当且仅当输入表达式中两个位(正在被解析的当前位)的值都为 1 时,结果中的位才被设置为 1;否则,结果中的位被设置为 0。

  例如:select 170 & 75


1010 1010   0100 1011   -------------------
0000 1010  


(2)“逻辑位或”。  如果在输入表达式中有一个位为 1 或两个位均为 1(对于正在解析的当前位),那么结果中的位将被设置为 1;如果输入表达式中的两个位都不为 1,则结果中的位将被设置为 0。

  例如:select 170 | 75


1010 1010   0100 1011   -------------------
1110 1011  


(3)“逻辑位异或”。 如果相对应的两个位的值都为 0 或者都为 1,那么结果中该位的值被清除为 0;否则(相对应的两个位的值仅有1个为1),结果中该位的值被设置为 1。

  例如:select 170 ^ 75


1010 1010   0100 1011   -------------------
1110 0001  



三、读取并判断:

  例如:if (170 & 8)=8,用于判断右数第4位是否为1。即只需要对这个“位”执行“逻辑位与”运算,屏蔽掉其它7个位。


1010 1010   0000 1000  

-------------------

0000 1000  


自定义函数:

CREATE  FUNCTION dbo.JudgeBit
     ( @combinedValue Tinyint, @BitPosition Tinyint)
RETURNS Bit
AS
BEGIN
     RETURN @combinedValue & POWER(2,@BitPosition-1)
END

-- @combinedValue 原始值(10进制),例如:170

-- @BitPosition 第几位,例如:4

-- 返回值为0或1


四、赋值:

(1) 将某位设为1

  只需要对这个“位”执行“逻辑位或”运算,即 select x | 8

例如:

1010 1010   0000 0100  

-------------------
1010 1110  


(2) 将某位设为0。

  先判断这个位是否已经为0;如果当前为1,则需要对这个“位”执行“逻辑位异或”运算,即 if (x & 8)=8 select x ^ 8

例如:

1010 1010  

0000 1000  

-------------------

1010 0010  


自定义函数:

CREATE FUNCTION SetBitValue
     ( @combinedValue Tinyint, @BitPosition Tinyint, @BitValue Bit)
RETURNS Tinyint
AS
BEGIN
    DECLARE @ReturnValue Tinyint
    IF @BitValue=1
 BEGIN
     select @ReturnValue=@combinedValue | POWER(2,@BitPosition-1)
    END
 ELSE
 BEGIN
     IF @combinedValue & POWER(2,@BitPosition-1)=@BitValue
         select @ReturnValue=@combinedValue
     ELSE
         select @ReturnValue=@combinedValue ^ POWER(2,@BitPosition-1)
    END 
 RETURN @ReturnValue
END


-- @combinedValue 原始值(10进制),例如:170

-- @BitPosition 第几位,例如:4

-- @BitValue 赋值,只能为0或1

-- 返回值(10进制),例如:170




提示:

  SQL Server 2008 提供了类似C语言的赋值函数,例如“&=”(位与等于)、“|=”(位于等于)、“^=”(位异或等于)。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn