トップページに戻る    次の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)