我在VB6中有If
条件
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
可以是任意数字。
答案 0 :(得分:15)
注意:由于原始问题中缺少信息,因此对此答案进行了大量编辑。此版本的答案现在基于更新的问题和足够的信息。对于历史记录,请检查编辑日志。
两件事:
&&
来确定逻辑AND值^
表示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');
这取代了整个循环。
答案 1 :(得分:3)
看起来它在这种情况下使用VB进行按位AND,所以可能:
if ( (1 & ( 2 ^ 1)) != 0)
但是,这是一个常数!你确定那里某处没有变量吗?
2 ^ 1是3; 1&amp; 3是1;所以这永远是真的
(至少在C#下,其中^是XOR;我被告知在VB中是^,所以2 ^ 1是2; 1&amp; 2是0;所以这总是假的......)
答案 2 :(得分:1)
我不明白条件语法......你的意思是1&amp; (2 ^ 1))? (仅使用一个&符号进行按位比较!)(但这是常量!)
但如果a是一个字符串, 那么
a += Conditional? "1": "0";
答案 3 :(得分:0)
尝试
if ( 1 & ( 2 ^ 1))
a = a + "1";
else
a= a+ "0";
答案 4 :(得分:0)
不要使用短路和。试试这个:
if (1 & (2 ^ 1) == 1)
{
a = a + "1";
}
else
{
a = a + "0";
}
答案 5 :(得分:0)
你的帖子毫无意义:
IF ( 1 AND ( 2 ^ 1)) Then
a = a + " 1"
Else
a = a + " 0"
2 ^ 1 = 2 = Math.Pow(2,1) 1 AND 2 = 1&amp; 2 = 0
这个逻辑意味着if的结果总是为零。
答案 6 :(得分:0)
如果我理解你想要做的是在循环中做什么
if i is even
a = a + "0"
else
a = a+"1"
在这种情况下,如果你刚写了
会更好for (int i=7;i>=0;i--)
{
bin+=(i % 2).ToString();
}
对于循环中的字符串concaternation,你应该使用StringBuilder类而不是+ operator。
答案 7 :(得分:0)
仅供参考,是Lasse最终代码的更简洁版本:
Char[] digits = new Char[8]; // change if you want more/fewer digits
int index = digits.Length;
var x = intNumber;
do {
digits[--index] = '0' + (x & 1);
x >>= 1;
} while (index);
bin = new String(digits);
基本上,这利用了这样一个事实,即我们可以轻松地将数字移位,因为移动了面具。如果我们以这种方式做事,AND操作的结果总是数字,这是我们在字符串中想要的数字,所以我们只需通过添加'0'(或48或0x30)将其转换为ASCII字符