トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
10-163 ビット演算(NOT)
SQLパズル
numBinTable
num bin
--- ----
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
ビットでの、NOTを求める
出力結果
num bin BitNOT
--- ---- ------
0 0000 1111
1 0001 1110
2 0010 1101
3 0011 1100
4 0100 1011
5 0101 1010
6 0110 1001
7 0111 1000
8 1000 0111
データ作成スクリプト
create table numBinTable2 as
select 0 as num,'0000' as bin from dual
union select 1,'0001' from dual
union select 2,'0010' from dual
union select 3,'0011' from dual
union select 4,'0100' from dual
union select 5,'0101' from dual
union select 6,'0110' from dual
union select 7,'0111' from dual
union select 8,'1000' from dual;
create or replace function to_base( p_dec in number, p_base in number )
return varchar2
is
l_str varchar2(255) default NULL;
l_num number default p_dec;
l_hex varchar2(50) default '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
begin
if ( trunc(p_dec) <> p_dec OR p_dec < 0 ) then
raise PROGRAM_ERROR;
end if;
loop
l_str := substr( l_hex, mod(l_num,p_base)+1, 1 ) || l_str;
l_num := trunc( l_num/p_base );
exit when ( l_num = 0 );
end loop;
return l_str;
end to_base;
/
SQL
select num as anum,bin,
LPad(to_base(num+15-2*bitand(num,15),2),4,'0') as "BitNOT"
from numBinTable2;
解説
全てのビットが1の値との、排他的論理和を計算して
BitNOTを求めてます
■■■■■■■■■■■■■■■■■■■■■■■■■■
例
10101のBitNOTは、
01010
そして、全てのビットが1の値との、
排他的論理和は、
10101
XOR 11111
----------
01010
8-20 集合関数のBitAND,BitOR,BitXOR
10-162 ビット演算(AND,OR,XOR)