memomem

備忘録・メモ置き場

ビット操作

www.cc.kyoto-su.ac.jp

ビット番号  7   6   5   4   3   2   1   0  
表す数値    128 64  32  16  8   4   2   1

csharp.keicode.com

0進数の 5 は 2 進数で 101 ですが、これを C# のコード内で記述するには、 `0b101` とします。

ufcpp.net

16進数リテラル
普通に数字を並べると10進数扱いされますが、先頭に0xを付けると16進数で数値を書けるようになります(hexadecimal literals)。

var x = 0xFF;       // 16進数のFF = 15×16 + 15 = 10進数だと 255
var y = 0XabcdABCD; // 0X や、A~F の記号は大文字・小文字どちらでもOK
2進数リテラル
C# 7で、2進数でもリテラルを書けるようになりました(binary literals)。 先頭に0bを付けると2進数リテラルになります。

var x = 0b10010101; // 2進数の10010101 = 128 + 16 + 4 + 1 = 10進数だと 149
var y = 0B1111;     // b は大文字・小文字どちらでもOK
よくある用途としては、「フラグ」があります。 以下のように、ビットごとに意味があって、ビットの組み合わせを表したい場合です。
数字区切り文字
C# 7では、数値リテラルの数字と数字の間に、_で区切りを入れれるようになりました。 リテラルの桁数が大きい時に便利です。

var million = 1_000_000;
var abcd = 0b1010_1011_1100_1101; // 特に2進数リテラルで有用
var abcd2 = 0xab_cd;              // 16進数リテラルにも使える
var x = 1.123_456_789;            // 浮動小数点数リテラルにも使える
int testValue = 255;
string binStr = Convert.ToString(testValue, 2).PadLeft(8, '0'); // 11111111

数値へ

int ConvertToValue(BitArray bits)
{
            int b = 0;
            int v = 1;
            for (int i = 0; i < bits.Length; i++)
            {
                if (bits.Get(i))
                {
                    b += v;
                };
                v *= 2;
            }
            return b;
}
int v1 = Convert.ToByte(str, 2);

Debug.Log("byte >> " + ((str[0] == '1' ? -256 : 0) + v1));
Debug.Log("sbyte >> " + (sbyte)v1);

stackoverflow.com

        static int GetIntFromBitArray(BitArray bitArray)
        {
            if (bitArray.Length > 32)
                throw new ArgumentException("Argument length shall be at most 32 bits.");

            int[] array = new int[1];
            bitArray.CopyTo(array, 0);
            return array[0];
        }

BitArrayをStringへ

// https://stackoverflow.com/questions/3917086/convert-bitarray-to-string
    string ToBitString(BitArray bits)
    {
        var sb = new System.Text.StringBuilder();
        for (int i = 0; i < bits.Count; i++)
        {
            char c = bits[bits.Count - 1 - i] ? '1' : '0';
            sb.Append(c);
        }
        return sb.ToString();
    }

cast

using System.Linq;

BitArray bits = new BitArray(bytes);
var target = bits.Cast<bool>();//使用しやすいように変換

符号

e-words.jp

www.cc.kyoto-su.ac.jp

// 符号有り8bit文字列を数値へ
string str = "10000001";

int v1 = Convert.ToByte(str, 2);

Debug.Log("byte >> " + ((str[0] == '1' ? -256 : 0) + v1)); // -127
Debug.Log("sbyte >> " + (sbyte)v1); // -127
// 符号有り5bitを数値へ
int v = ((bits[5]) ? -2048 : 0) + GetIntFromBitArray(steer);

符号Bit

参考

learn.microsoft.com

sbyte    -128 ~ 127    符号付き 8 ビット整数  System.SByte
byte    0 ~ 255   符号なし 8 ビット整数  System.Byte
short   -32,768 ~ 32,767  符号付き 16 ビット整数 System.Int16
ushort  0 ~ 65,535    符号なし 16 ビット整数 System.UInt16
int -2,147,483,648 ~ 2,147,483,647    符号付き 32 ビット整数 System.Int32
uint    0 ~ 4,294,967,295 符号なし 32 ビット整数 System.UInt32
long    -9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 符号付き 64 ビット整数 System.Int64
ulong   0 ~ 18,446,744,073,709,551,615    符号なし 64 ビット整数 System.UInt64
nint    プラットフォームに依存 (実行時に計算)  符号付き 32 ビットまたは 64 ビット整数   System.IntPtr
nuint   プラットフォームに依存 (実行時に計算)  符号なし 32 ビットまたは 64 ビット整数   System.UIntPtr

atmarkit.itmedia.co.jp