2

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中可以是任何数字。

4

8 回答 8

15

注意:由于原始问题中缺乏信息,此答案已被大量编辑。此版本的答案现在基于具有足够信息的更新问题。有关历史记录,请查看编辑日志。

两件事情:

  • &&用于布尔表达式之间,以确定逻辑与值
  • ^在 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);

然而,这是踢球者。在 .NET 中已经有一种方法可以将 Int32 值转换为充满二进制数字的字符串,这就是 Convert.ToString 方法。唯一的区别是它不添加任何前导零,所以我们必须自己做。

因此,这是您应该使用的最终代码:

String bin = Convert.ToString(intNumber, 2).PadLeft(8, '0');

这将替换整个循环。

于 2008-12-30T14:50:23.463 回答
3

在这种情况下,它看起来像是使用 VB 进行按位与,所以也许:

if ( (1 & ( 2 ^ 1)) != 0)

然而,这是一个常数!你确定那里没有变量吗?

2 ^ 1 是 3;1 & 3 为 1;所以这永远是真的

(至少,在 C# 下,^ 是 XOR;有人告诉我在 VB 中 ^ 是 POWER,所以 2 ^ 1 是 2;1 & 2 是 0;所以这总是错误的......)

于 2008-12-30T14:50:33.433 回答
1

我不明白条件语法...你的意思是 1 & ( 2 ^ 1)) 吗?(仅使用一个 & 符号进行按位比较!)(但这是恒定的!)

但如果 a 是一个字符串,那么

 a +=  Conditional?  "1": "0";
于 2008-12-30T14:51:34.977 回答
0

尝试

if ( 1 & ( 2 ^ 1))
  a = a + "1";
else
  a= a+ "0";
于 2008-12-30T14:49:10.253 回答
0

不要使用短路和。试试这个:

if (1 & (2 ^ 1) == 1)
{
    a = a + "1";
}
else
{
    a = a + "0";
}
于 2008-12-30T14:49:47.820 回答
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 & 2 = 0

此逻辑意味着 if 的结果将始终为零。

于 2008-12-30T15:28:48.787 回答
0

如果我理解正确你想要做的是循环做

if i is even
a = a + "0"
else
a = a+"1"

在这种情况下,如果你只是写会更好

for (int i=7;i>=0;i--)
{
   bin+=(i % 2).ToString();
}

同样对于循环中的字符串连接,您应该使用 StringBuilder 类而不是 + 运算符。

于 2008-12-30T17:46:34.513 回答
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 字符.

于 2010-12-12T20:17:57.973 回答