将整数转换为带前导零的二进制字符串
本文关键字:二进制 字符串 整数 转换 | 更新日期: 2023-09-27 18:05:34
我需要将int转换为bin和额外的位。
string aaa = Convert.ToString(3, 2);
返回11
,但我需要0011
或00000011
。
怎么做?
11
为3
的二进制表示。该值的二进制表示为2
位。
3 = 20 * 1 + 21 * 1
您可以使用String.PadLeft(Int, Char)
方法来添加这些零。
// convert number 3 to binary string.
// And pad '0' to the left until string will be not less then 4 characters
Convert.ToString(3, 2).PadLeft(4, '0') // 0011
Convert.ToString(3, 2).PadLeft(8, '0') // 00000011
我创建了一个动态写入前导零的方法
public static string ToBinary(int myValue)
{
string binVal = Convert.ToString(myValue, 2);
int bits = 0;
int bitblock = 4;
for (int i = 0; i < binVal.Length; i = i + bitblock)
{ bits += bitblock; }
return binVal.PadLeft(bits, '0');
}
首先将我的值转换为二进制。初始化位以设置二进制输出的长度。一个比特块有4位数字。在for循环中,我们检查转换后的二进制值的长度,并为二进制输出的长度加上"位"。
例子:输入:1 -> 0001;输入:127 -> 01111111等等…
您可以使用这些方法:
public static class BinaryExt
{
public static string ToBinary(this int number, int bitsLength = 32)
{
return NumberToBinary(number, bitsLength);
}
public static string NumberToBinary(int number, int bitsLength = 32)
{
string result = Convert.ToString(number, 2).PadLeft(bitsLength, '0');
return result;
}
public static int FromBinaryToInt(this string binary)
{
return BinaryToInt(binary);
}
public static int BinaryToInt(string binary)
{
return Convert.ToInt32(binary, 2);
}
}
示例:int number = 3;
string byte3 = number.ToBinary(8); // output: 00000011
string bits32 = BinaryExt.NumberToBinary(3); // output: 00000000000000000000000000000011
public static String HexToBinString(this String value)
{
String binaryString = Convert.ToString(Convert.ToInt32(value, 16), 2);
Int32 zeroCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(binaryString.Length) / 8)) * 8;
return binaryString.PadLeft(zeroCount, '0');
}
Just what Soner answer use:
Convert.ToString(3, 2).PadLeft(4, '0')
只是想补充一下,让你知道。int形参是字符串的字符总数,char形参是将被添加以填充字符串中缺少的空间的字符。在您的示例中,您希望输出0011,这是4个字符,需要0,因此您使用4作为int参数,并使用'0'作为char。
这可能不是最优雅的解决方案,但它是我测试中最快的:
string IntToBinary(int value, int totalDigits) {
char[] output = new char[totalDigits];
int diff = sizeof(int) * 8 - totalDigits;
for (int n = 0; n != totalDigits; ++n) {
output[n] = (char)('0' + (char)((((uint)value << (n + diff))) >> (sizeof(int) * 8 - 1)));
}
return new string(output);
}
string LongToBinary(int value, int totalDigits) {
char[] output = new char[totalDigits];
int diff = sizeof(long) * 8 - totalDigits;
for (int n = 0; n != totalDigits; ++n) {
output[n] = (char)('0' + (char)((((ulong)value << (n + diff))) >> (sizeof(long) * 8 - 1)));
}
return new string(output);
}
这个版本完全避免了if语句和分支,从而创建了非常快速和最重要的线性代码。这比microsoft的Convert.ToString()函数高出50%
下面是一些基准代码
long testConv(Func<int, int, string> fun, int value, int digits, long avg) {
long result = 0;
for (long n = 0; n < avg; n++) {
var sw = Stopwatch.StartNew();
fun(value, digits);
result += sw.ElapsedTicks;
}
Console.WriteLine((string)fun(value, digits));
return result / (avg / 100);//for bigger output values
}
string IntToBinary(int value, int totalDigits) {
char[] output = new char[totalDigits];
int diff = sizeof(int) * 8 - totalDigits;
for (int n = 0; n != totalDigits; ++n) {
output[n] = (char)('0' + (char)((((uint)value << (n + diff))) >> (sizeof(int) * 8 - 1)));
}
return new string(output);
}
string Microsoft(int value, int totalDigits) {
return Convert.ToString(value, toBase: 2).PadLeft(totalDigits, '0');
}
int v = 123, it = 10000000;
Console.WriteLine(testConv(Microsoft, v, 10, it));
Console.WriteLine(testConv(IntToBinary, v, 10, it));
这是我的结果
0001111011
122
0001111011
75
微软的方法需要1.22个滴答,而我的方法只需要0.75个滴答
string aaa = Convert.ToString(3, 2).PadLeft(10, '0');
使用此方法,您可以获得带有相应前导零的字符串的二进制表示。
string binaryString = Convert.ToString(3, 2);;
int myOffset = 4;
string modified = binaryString.PadLeft(binaryString.Length % myOffset == 0 ? binaryString.Length : binaryString.Length + (myOffset - binaryString.Length % myOffset), '0'));
在你的情况下,修改字符串将是0011
,如果你想,你可以改变偏移量为8,例如,你会得到00000011
等