c# - 等价于 C# 中的 `IF ( X AND ( 2 ^ Y ) ) Then`

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

最佳答案

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

两件事:

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

这会替换整个循环。

关于c# - 等价于 C# 中的 `IF ( X AND ( 2 ^ Y ) ) Then`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/400432/

相关文章:

c# - 通用列表的标准偏差?

C# 计算数字和字母

sql - MSSQL Server 中 <> 和 != 运算符的区别

javascript - ES6 JS 中的扩展语法如何作为函数参数工作?

php - 为什么使用 !== FALSE 来检查 php 中的 stripos?

c# - `db.Database.SqlQuery<model>`使用后如何清除参数

c# - Visual Studio - 继承控件的新 "default"属性值

vb6 - 从 vb6 关闭外部应用程序

memory-management - 在 VB 中使用 COM 对象时如何正确管理内存?

c++ - 从VB6调用C dll,其中dll是使用Visual Studio 2013编写的