ビット番号 7 6 5 4 3 2 1 0 表す数値 128 64 32 16 8 4 2 1
0進数の 5 は 2 進数で 101 ですが、これを C# のコード内で記述するには、 `0b101` とします。
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);
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>();//使用しやすいように変換
符号
// 符号有り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
参考
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