C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

SQLServerでのシフト計算方法

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■96495 / inTopicNo.1)  SQLServerでのシフト計算方法
  
□投稿者/ 夜叉姫 (7回)-(2020/12/02(Wed) 13:01:48)

分類:[.NET 全般] 

2020/12/02(Wed) 13:18:58 編集(投稿者)
右シフト(>>)を計算する方法がわかりません。
どうやって行うのでしょうか?

(@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

引用返信 編集キー/
■96496 / inTopicNo.2)  Re[1]: SQLServerでのシフト計算方法
□投稿者/ kiku (209回)-(2020/12/02(Wed) 13:21:31)
2020/12/02(Wed) 13:25:12 編集(投稿者)

No96495 (夜叉姫 さん) に返信
> 右シフト(>>)を計算する方法がわかりません。
> どうやって行うのでしょうか?

整数演算で2で割ると右1ビットシフトになります。
2^2で割ると右2ビットシフトになります。

右4ビットシフトの場合、
2^4=16なので
16で割ると実現できます。
結果は小数点以下を切り捨ててください。
引用返信 編集キー/
■96497 / inTopicNo.3)  Re[1]: SQLServerでのシフト計算方法
□投稿者/ 774RR (846回)-(2020/12/02(Wed) 13:21:52)
MySQL (MariaDB) なら
mysql> select 65536>>8;
+----------+
| 65536>>8 |
+----------+
|      256 |
+----------+
1 row in set (0.00 sec)

となったのだが SQL Server ではなんかなさそうな雰囲気
https://docs.microsoft.com/ja-jp/sql/t-sql/language-elements/operators-transact-sql?view=sql-server-ver15

引用返信 編集キー/
■96498 / inTopicNo.4)  Re[2]: SQLServerでのシフト計算方法
□投稿者/ 夜叉姫 (8回)-(2020/12/02(Wed) 13:40:46)
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

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ