我有这个 If 条件中的维生素b6

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";

但是这个东西是给我一种错误。

这是我完成VB代码,我想转到C#

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

有帮助吗?

解决方案

注意到:这个答案已经重编辑,由于缺乏信息在原来的问题。这个版本的答案是现在根据更新的问题与足够的信息。历史上,检查编辑的记录。

两件事情:

  • && 使用之间的布尔语,以确定合乎逻辑和值
  • ^ C#装置异,没有提出的权力。你不问一个问题,关于这一点,但这是不可避免的,你发现了 ^ 没有出现要做的工作。

&& 是容易处理,因为它可以替换为一个单一的 & 相反,它具有双重意义,这取决于环境。无论它是一个全评估的逻辑和操作员(&& 是一个短路一),或者它是一位操作员,这是你想要什么在这里。

^ 是不同的。最直接等同的是 数学。Pow, 但在这种情况下,一种更好的选择是可用的、位移。

情况下 2^X 可以认为 移的1位X职位的左侧, , 移位到左边 有自己的操作员, << 操作员。

所以 2^X 可以换成 1 << X.

在此背景下,这里是什么你想对你内心的-大多数,如果声明:

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值串充分的二进制数字。净额,这是转换。ToString方法。唯一的区别是,它并没有增加任何导致零,所以我们要做我们自己。

因此,在这里的最后码你应使用:

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

这将替换的整个循环。

其他提示

看起来它在这种情况下使用VB进行按位AND,所以可能:

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

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

2 ^ 1是3; 1 <!> amp; 3是1;所以这永远是真的

(至少在C#下,其中^是XOR;我被告知在VB中是^,所以2 ^ 1是2; 1 <!> amp; 2是0;所以这总是假的。 ..)

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

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

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

尝试

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

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

if (1 & (2 ^ 1) == 1)
{
    a = a + "1";
}
else
{
    a = a + "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的结果总是为零。

如果我理解你想要做的是在循环中做什么

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。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top