我If
在VB6中有这个条件
If ( X AND ( 2 ^ Y)) Then a = a + " 1" Else a = a + " 0"
我想在C#中使用相同的等价物
我尝试过这样做
if ( X && ( 2 ^ Y)) // ERROR: && can not be used between int to int a = a + "1"; else a = a + "0";
但这件事给我一个错误.
这是我想要转换成C#的完整VB代码
For i = 7 To 0 Step -1 If intNumber And (2 ^ i) Then ' Use the logical "AND" operator. bin = bin + "1" Else bin = bin + "0" End If Next
在上面的代码intNumber
可以是任何数字.
注意:由于原始问题中缺少信息,因此对此答案进行了大量编辑.此版本的答案现在基于更新的问题和足够的信息.对于历史记录,请检查编辑日志.
两件事情:
&&
在布尔表达式之间使用,以确定逻辑AND值
^
在C#中意味着XOR,而不是提升到权力.你没有问过这个问题,但你不可避免地发现它^
似乎没有做到这一点.
这&&
很容易处理,因为它可以替换为单个&
,具有双重含义,具体取决于上下文.它是一个完整的评估逻辑AND运算符(&&
是一个短路的运算符),或者它是一个按位运算符,这就是你想要的.
的^
虽然是不同的.最直接的等价物是Math.Pow,但在这种情况下,可以使用更好的替代方案,即位移.
的情况下2^X
可以被认为是1比特X的位置向左移动,并且位左移有它自己的操作者,所述<<
操作者.
所以2^X
可以替换为1 << X
.
在这种情况下,这是你想要的最内层的if语句:
if ((intNumber & (1 << index)) != 0) a = a + "1"; else a = a + "0";
将其插入到您的底部示例中的循环中,您就可以得到:
for (Int32 index = 7; index >= 0; index--) if ((intNumber & (1 << index)) != 0) bin = bin + "1"; else bin = bin + "0";
现在,连接这样的字符串会产生GC压力,因此您应该将这些数字存储到Char
数组中,然后构造字符串,或者使用StringBuilder类.否则你将构建8(从我的例子)不同大小的字符串,你只会使用并保留最后一个.根据具体情况,这可能不会造成问题,但如果您多次调用此代码,它会累加起来.
这是最终代码的更好版本:
Char[] digits = new Char[8]; // change if you want more/fewer digits for (Int32 index = 0; index < digits.Length; index++) if ((intNumber & (1 << index)) != 0) digits[digits.Length - 1 - index] = '1'; else digits[digits.Length - 1 - index] = '0'; bin = new String(digits);
然而,这是踢球者.已经有一种方法可以将Int32值转换为.NET中充满二进制数字的字符串,它是Convert.ToString方法.唯一的区别是它不会添加任何前导零,所以我们必须自己做.
所以,这是你应该使用的最终代码:
String bin = Convert.ToString(intNumber, 2).PadLeft(8, '0');
这取代了整个循环.