在C#中相当于`IF(X AND(2 ^ Y))Then`

时间:2008-12-30 14:45:34

标签: c# vb6 operators translation

我在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可以是任意数字。

8 个答案:

答案 0 :(得分:15)

注意:由于原始问题中缺少信息,因此对此答案进行了大量编辑。此版本的答案现在基于更新的问题和足够的信息。对于历史记录,请检查编辑日志。

两件事:

    在布尔表达式之间使用
  • &&来确定逻辑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');

这取代了整个循环。

答案 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字符