右シフト(>>)を計算する方法がわかりません。
どうやって行うのでしょうか?
(@BIT >> 4) & 0x0f
このような計算をするには以下のような力づくでやるしか手はないのでしょうか?
DECLARE @BIT INT = 80;
SELECT CASE WHEN (@BIT & 16) > 0 THEN 1 ELSE 0 END +
CASE WHEN (@BIT & 32) > 0 THEN 2 ELSE 0 END +
CASE WHEN (@BIT & 64) > 0 THEN 4 ELSE 0 END +
CASE WHEN (@BIT & 128) > 0 THEN 8 ELSE 0 END
■No96496 (kiku さん) に返信
> 2020/12/02(Wed) 13:25:12 編集(投稿者)
>
> ■No96495 (夜叉姫 さん) に返信
>>右シフト(>>)を計算する方法がわかりません。
>>どうやって行うのでしょうか?
>
> 整数演算で2で割ると右1ビットシフトになります。
> 2^2で割ると右2ビットシフトになります。
>
> 右4ビットシフトの場合、
> 2^4=16なので
> 16で割ると実現できます。
> 結果は小数点以下を切り捨ててください。
なるほど、ありがとうございました。
思わず以下のSQLを作成してしまいました。
DECLARE @BIT INT = 80; -- 元データ
DECLARE @SFT INT = 5; -- シフト数
DECLARE @DIV INT = POWER(2, @SFT)
SELECT (
CASE WHEN (@BIT & 1) > 0 AND @SFT < 1 THEN 1 / @DIV ELSE 0 END +
CASE WHEN (@BIT & 2) > 0 AND @SFT < 2 THEN 2 / @DIV ELSE 0 END +
CASE WHEN (@BIT & 4) > 0 AND @SFT < 3 THEN 4 / @DIV ELSE 0 END +
CASE WHEN (@BIT & 8) > 0 AND @SFT < 4 THEN 8 / @DIV ELSE 0 END +
CASE WHEN (@BIT & 16) > 0 AND @SFT < 5 THEN 16 / @DIV ELSE 0 END +
CASE WHEN (@BIT & 32) > 0 AND @SFT < 6 THEN 32 / @DIV ELSE 0 END +
CASE WHEN (@BIT & 64) > 0 AND @SFT < 7 THEN 64 / @DIV ELSE 0 END +
CASE WHEN (@BIT & 128) > 0 AND @SFT < 8 THEN 128 / @DIV ELSE 0 END +
CASE WHEN (@BIT & 256) > 0 AND @SFT < 9 THEN 256 / @DIV ELSE 0 END +
CASE WHEN (@BIT & 512) > 0 AND @SFT < 10 THEN 512 / @DIV ELSE 0 END +
CASE WHEN (@BIT & 1024) > 0 AND @SFT < 11 THEN 1024 / @DIV ELSE 0 END +
CASE WHEN (@BIT & 2048) > 0 AND @SFT < 12 THEN 2048 / @DIV ELSE 0 END +
CASE WHEN (@BIT & 4096) > 0 AND @SFT < 13 THEN 4096 / @DIV ELSE 0 END +
CASE WHEN (@BIT & 8192) > 0 AND @SFT < 14 THEN 8192 / @DIV ELSE 0 END +
CASE WHEN (@BIT & 16384) > 0 AND @SFT < 15 THEN 16384 / @DIV ELSE 0 END +
CASE WHEN (@BIT & 32768) > 0 AND @SFT < 16 THEN 32768 / @DIV ELSE 0 END
) & 0x0f