一、場景:
在某些場景中,需要儲存一系列的bit型。為了簡化資料庫結構或其它特殊的要求,可以將8個bit型儲存為1個byte中(例如,tinyint型)。
二、邏輯位運算函式:
(1) 「邏輯位與」。當且僅當輸入表示式中兩個位(正在被解析的當前位)的值都為 1 時,結果中的位才被設定為 1;否則,結果中的位被設定為 0。
例如:select 170 & 75
1010 1010 <– 170
0000 1010 <– 10
(2)「邏輯位或」。 如果在輸入表示式中有乙個位為 1 或兩個位均為 1(對於正在解析的當前位),那麼結果中的位將被設定為 1;如果輸入表示式中的兩個位都不為 1,則結果中的位將被設定為 0。
例如:select 170 | 75
1010 1010 <– 170
1110 1011 <– 235
(3)「邏輯位異或」。 如果相對應的兩個位的值都為 0 或者都為 1,那麼結果中該位的值被清除為 0;否則(相對應的兩個位的值僅有1個為1),結果中該位的值被設定為 1。
例如:select 170 ^ 75
1010 1010 <– 170
1110 0001 <– 225
三、讀取並判斷:
例如:if (170 & 8)=8,用於判斷右數第4位是否為1。即只需要對這個「位」執行「邏輯位與」運算,遮蔽掉其它7個位。
1010 1010 <– 170
0000 1000 <– 8
0000 1000 <– 8
自定義函式:
create function dbo.judgebit
( @combinedvalue tinyint, @bitposition tinyint)
returns bit
asbegin
return @combinedvalue & power(2,@bitposition-1)
end
– @combinedvalue 原始值(10進製),例如:170
– @bitposition 第幾位,例如:4
– 返回值為0或1
四、賦值:
(1) 將某位設為1
只需要對這個「位」執行「邏輯位或」運算,即 select x | 8
例如:1010 1010 <– 170
0000 0100 <– 4
1010 1110 <– 174
(2) 將某位設為0。
先判斷這個位是否已經為0;如果當前為1,則需要對這個「位」執行「邏輯位異或」運算,即 if (x & 8)=8 select x ^ 8
例如:1010 1010 <– 170
0000 1000 <– 8
1010 0010 <– 162
自定義函式:
create function setbitvalue
( @combinedvalue tinyint, @bitposition tinyint, @bitvalue bit)
returns tinyint
asbegin
declare @returnvalue tinyint
if @bitvalue=1
begin
select
@returnvalue=@combinedvalue | power(2,@bitposition-1)
endelse
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語言的賦值函式,例如「&=」(位與等於)、「|=」(位於等於)、「^=」(位異或等於)。
本文出自 「我們一起追過的mssql」 部落格,請務必保留此出處
SQL Server 邏輯位運算示例
一 場景 在某些場景中,需要儲存一系列的bit型。為了簡化資料庫結構或其它特殊的要求,可以將8個bit型儲存為1個byte中 例如,tinyint型 二 邏輯位運算函式 1 邏輯位與 當且僅當輸入表示式中兩個位 正在被解析的當前位 的值都為 1 時,結果中的位才被設定為 1 否則,結果中的位被設定為...
SQL Server 邏輯位運算示例
一 場景 在某些場景中,需要儲存一系列的bit型。為了簡化資料庫結構或其它特殊的要求,可以將8個bit型儲存為1個byte中 例如,tinyint型 二 邏輯位運算函式 1 邏輯位與 當且僅當輸入表示式中兩個位 正在被解析的當前位 的值都為 1 時,結果中的位才被設定為 1 否則,結果中的位被設定為...
邏輯位運算與邏輯運算
兩者非常容易混淆,其實這是截然不同的兩種運算.1.邏輯位運算 與運算 1 2 0 0000 0001 0000 0010 0000 0000 0 或運算 1 2 3 0000 0001 0000 0010 0000 0011 3 按位求反 運算,異或 運算略.移位 左移,右移 運算略.2.邏輯運算 ...