2008-12-30 38 views
2

我在VB6這If條件相當於`IF(x和(2^Y))Then`在C#

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#

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代碼。

+0

你想完成什麼?我不知道VB,那麼你可以擴展你想做什麼嗎? – 2008-12-30 14:49:23

+0

我更新了我的答案,以反映您的位數和變量名稱。你想要的代碼在它的底部。 – 2008-12-30 15:43:28

回答

15

注意:這個答案已經被大量編輯,由於缺乏在原來的問題的信息。此版本的答案現在基於具有足夠信息的更新問題。對於歷史記錄,請檢查編輯日誌。

兩件事情:

  • &&使用布爾表達式之間,以確定C#的邏輯AND-值
  • ^意味着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'); 

這將替換整個循環。

+0

2^1是2 XOR 1,即3 – 2008-12-30 14:53:06

0

嘗試

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

不要使用短路和。試試這個:

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

它看起來就像是用VB做的按位在這種情況下,或許:

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

然而,這是一個不變!你確定在那裏沒有變量嗎?

2^1是3; 1 & 3是1;所以這永遠是真的

(至少,在C#下,其中^是XOR;我被告知在VB中是POWER,所以2^1是2; 1是& 2是0;所以這總是會的是假...)

1

我不明白條件語法...你的意思是1 &(2^1))? (僅使用一個按位比較符號!)(不過這是不變的!)

但如果是一個字符串, 然後

a += Conditional? "1": "0"; 
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的結果al方式是零。

0

如果我理解正確,你想做的事是在一個循環做

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

在這種情況下,它會更好,如果你只是寫

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

也爲字符串concaternation在循環中,您應該使用StringBuilder類不+運算符。

0

僅供參考,拉塞的的最終代碼更簡潔的版本:

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字符, 。