PL/SQLにshift
演算子の代替があるかどうかを確認します。 bitand
関数がありますが、それはbinary_integer型引数のみを受け入れます。PL/SQLのシフト演算子
本当に長い番号の下位/上位ビットをチェックする必要がある場合はどうすればよいですか(おそらく、その行に設定されています)。
C
には、<<
と>>
の演算子があります。私はPL/SQLでどのようにそれらを実現できますか?
PL/SQLにshift
演算子の代替があるかどうかを確認します。 bitand
関数がありますが、それはbinary_integer型引数のみを受け入れます。PL/SQLのシフト演算子
本当に長い番号の下位/上位ビットをチェックする必要がある場合はどうすればよいですか(おそらく、その行に設定されています)。
C
には、<<
と>>
の演算子があります。私はPL/SQLでどのようにそれらを実現できますか?
これは私自身のLPAD/RPADソリューションです。
私はTom Kyte packageをベースにして展開します。
create or replace function bin_shift_right
( p_bin in varchar2,
p_shift in number default null) return varchar2
is
l_len number;
l_shift number;
begin
l_shift := nvl(p_shift, 1);
l_len := length(p_bin);
if (l_len <= 0) then
return null;
end if;
if (l_shift > l_len) then
l_shift := l_len;
end if;
return lpad(substr(p_bin, 1, l_len - l_shift), l_len, '0');
end bin_shift_right;
create or replace function shright
( p_num in number,
p_shift in number default null) return number
is
begin
if (trunc(p_num) <> p_num OR p_num < 0) then
raise PROGRAM_ERROR;
end if;
return nvl(to_dec(bin_shift_right(to_bin(p_num), p_shift), 2), 0);
end shright;
/
やテスト
SQL>
SQL> select shright(123) from dual;
SHRIGHT(123)
------------
61
SQL>
SQL> select shright(123, 2) from dual;
SHRIGHT(123,2)
--------------
30
SQL>
SQL> select shright(123, 10) from dual;
SHRIGHT(123,10)
---------------
SQL>/
Oracleバージョン8以降、データベースにJavaコードを使用することは可能です。 PL/SQLでは、Javaコードのラッパーを定義できます。例えば
PACKAGE BODY JAVA_CODE
IS
function bitshift_left(x in number,
n in number) return number
is language java name 'com.foo.Bitshift(java.lang.Integer,
java.lang.Integer) return java.lang.Integer';
END JAVA_CODE;
Javaコードでは、シフト演算子を使用できます。少し不器用ですが、それはこのように動作することができます。
悲しいことに、これはOracle XEでは不可能です。その「無料版」ではJavaのサポートがないためです。
次の答えはとらわれないエンディアンされていないと私の文言は、リトルエンディアンフォーマットに基づいています...
あなたは、単に(シフトを乗算ビットをシフトすることができます引数を2でxのべき乗に分割する(右にシフトする)。ここで、xはシフトするビットの数である。私は、値16711680をシフトしたい場合は、逆に
select 255 * power(2,16) from dual;
-- the result will be (16711680:111111110000000000000000)
:例えば、私は数(255:11111111)の下位バイトシフトする必要がある場合は、左に16ビットを、私は、次の操作を実行します右に16ビット私は以下を実行するでしょう:
select 16711680/power(2,16) from dual;
-- the result will be (255:11111111)
おかげで、ソリューション、ありがとう。 私はpl/SQLの方法を見つける、私は数分以内に投稿する – drnk