相当于`如果(X和(2^Y)),然后在C#
-
03-07-2019 - |
题
我有这个 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字符