[英]Equivalent of `IF ( X AND ( 2 ^ Y ) ) Then` in C#
我在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
可以是任何數字。
注意 :由於原始問題中缺少信息,因此對此答案進行了大量編輯。 此版本的答案現在基於更新的問題和足夠的信息。 對於歷史記錄,請檢查編輯日志。
兩件事情:
&&
在布爾表達式之間使用,以確定邏輯AND值 ^
在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);
然而,這是踢球者。 已經有一種方法可以將Int32值轉換為.NET中充滿二進制數字的字符串,它是Convert.ToString方法。 唯一的區別是它不會添加任何前導零,所以我們必須自己做。
所以,這是你應該使用的最終代碼:
String bin = Convert.ToString(intNumber, 2).PadLeft(8, '0');
這取代了整個循環。
看起來它在這種情況下使用VB進行按位AND,所以可能:
if ( (1 & ( 2 ^ 1)) != 0)
但是,這是一個不變的! 你確定那里某處沒有變量嗎?
2 ^ 1是3; 1和3是1; 所以這總是如此
(至少在C#下,^是XOR;我被告知在VB中是^,所以2 ^ 1是2; 1&2是0;所以這總是假的......)
我不明白條件語法......你的意思是1&(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&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類而不是+運算符。
僅供參考,是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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.