【问题标题】:Equivalent of `IF ( X AND ( 2 ^ Y ) ) Then` in C#等效于 C# 中的 `IF ( X AND ( 2 ^ Y ) ) Then`
【发布时间】:2008-12-30 14:45:33
【问题描述】:

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

【问题讨论】:

  • 你想完成什么?我不了解 VB,所以请您详细说明您要做什么?
  • 我更新了我的答案以反映您的数字位数和变量名称。你想要的代码在它的底部。

标签: c# vb6 operators translation


【解决方案1】:

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

两件事:

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

这会替换整个循环。

【讨论】:

  • (当然,这对 VB 意味着什么,我会留给 VB 人;-p)
  • Marc,更正了我的回答,说这是我正在解释的 VB6 代码 :)
  • 我认为 lassevk 的最后一句话可以省略。我认为SO的精神是帮助人们。在这个过程中没有必要冷嘲热讽。
  • @perryneal.myopenid.com - 我不会把它归类为讽刺;他提出了一个公平的观点,那就是人们经常过度剪断他们发布的代码。有时他们会剪断它。这是一条很好的路线,但指出人们何时发布无益的内容是公平的。
  • 好吧,不要开玩笑,但我更正了我的答案。我仍然想要他的真实代码,在我看来,这是他真实代码的机会至少可以说非常渺茫。现在,如果它真正的代码,我也发布了真正的答案,这是我最初的单行。 :)
【解决方案2】:

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

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

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

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

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

【讨论】:

  • ^ 在 VB 中是幂,而不是 XOR ;)
  • 很公平 - 在这种情况下,您自己对值的分析是有效的;-p 该死的 VB!
【解决方案3】:

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

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

 a +=  Conditional?  "1": "0";

【讨论】:

    【解决方案4】:

    试试

    if ( 1 & ( 2 ^ 1))
      a = a + "1";
    else
      a= a+ "0";
    

    【讨论】:

      【解决方案5】:

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

      if (1 & (2 ^ 1) == 1)
      {
          a = a + "1";
      }
      else
      {
          a = a + "0";
      }
      

      【讨论】:

        【解决方案6】:

        你的帖子毫无意义:

        IF ( 1 AND ( 2 ^ 1)) Then 
         a = a + " 1" 
        Else
          a = a + " 0"
        

        2^1 = 2 = Math.Pow(2,1) 1 和 2 = 1 & 2 = 0

        这个逻辑意味着 if 的结果总是为零。

        【讨论】:

          【解决方案7】:

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

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

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

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

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

          【讨论】:

            【解决方案8】:

            仅供参考,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 字符.

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-01-07
              • 1970-01-01
              • 2022-10-18
              • 1970-01-01
              • 1970-01-01
              • 2021-06-04
              • 2023-03-24
              相关资源
              最近更新 更多