簡體   English   中英

在C#中相當於`IF(X AND(2 ^ Y))Then`

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM