C#.NETのサンプルコードを掲載しています。
      
指定したビット位置からサイズ分だけ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;
}



テストコード
1
2
3
4
5
6
7
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
      

変換処理






Copyright (C) 2011 - 2017 猫の気ままなC#日記