|
指定したビット位置からサイズ分だけ1詰めした数値を返す。
なさそうだから作ってみたが・・・
使う場面はないかも・・・
文字列"0011100"から数値へ変換するほうが簡単なのか?
いや、変換処理を通さず数値だけで処理してるからきっと早いはず。。
頑張って作ってみました。
こんな感じのメソッドです。
テストコード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
/// <summary>
/// 指定したbit位置からサイズ分だけ1詰めした値を返します。
/// </summary>
/// <param name="startBit">開始位置(1~32)</param>
/// <param name="length">長さ</param>
/// <returns>指定したbit位置からサイズ分だけ1詰めした値</returns>
public uint GetBitRangeOnePadding(int startBit, int length)
{
// 引数の値をチェック
if (startBit < 1 || 32 < startBit) { throw new ArgumentOutOfRangeException("引数startBitの範囲は1~32までです。"); }
if (length < 1) { throw new ArgumentOutOfRangeException("引数lengthに負の値は設定できません。"); }
if (32 < startBit - 1 + length) { throw new ArgumentOutOfRangeException("1詰めする範囲が無効です。"); }
uint val = 0;
int range = startBit + length - 1;
for (int i = 32; 0 < i; i--)
{
val = val << 1;
if (startBit <= i && i <= range)
{
val |= 0x00000001;
}
}
return val;
}
|
テストコード
|
uint r = 0;
r = GetBitRangeOnePadding(1, 1);
Console.WriteLine(Convert.ToString(r, 2).PadLeft(32, '0'));
r = GetBitRangeOnePadding(10, 5);
Console.WriteLine(Convert.ToString(r, 2).PadLeft(32, '0'));
|
出力
00000000000000000000000000000001
00000000000000000011111000000000
変換処理
|
|