문제

나는 이것을 가지고있다 If VB6의 상태

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 숫자가 될 수 있습니다.

도움이 되었습니까?

해결책

메모:이 답변은 원래 질문의 정보 부족으로 인해 크게 편집되었습니다. 이 답변 버전은 이제 충분한 정보가있는 업데이트 된 질문을 기반으로합니다. 역사의 경우 편집 로그를 확인하십시오.

두가지:

  • && 논리적 및 가치를 결정하기 위해 부울 표현 사이에 사용됩니다.
  • ^ C#에서는 XOR을 의미하며, 강력한 힘이 없습니다. 당신은 이것에 대해 질문하지 않았지만 당신이 그것을 발견 한 것은 불가피했습니다. ^ 일을하고있는 것처럼 보이지 않았습니다.

그만큼 && 단일로 교체 할 수 있으므로 쉽게 처리됩니다. & 대신 상황에 따라 이중 의미가 있습니다. 전체 평가 논리 및 연산자입니다 (&& 단락 된 것) 또는 약간의 연산자입니다. 여기에서 원하는 것입니다.

그만큼 ^ 그래도 다릅니다. 가장 직접적인 것은입니다 수학, 그러나이 경우 더 나은 대안을 사용할 수 있습니다.

의 경우에는 2^X AS를 생각할 수 있습니다 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 메소드입니다. 유일한 차이점은 주요 0을 추가하지 않기 때문에 스스로해야한다는 것입니다.

따라서 사용해야 할 최종 코드는 다음과 같습니다.

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

이것은 전체 루프를 대체합니다.

다른 팁

VB를 사용하여 비트를 사용 하고이 경우 아마도 다음과 같은 것 같습니다.

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 및 2 = 1 & 2 = 0

이 논리는 IF의 결과가 항상 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 Class Not + 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);

기본적으로 이것은 마스크를 왼쪽으로 이동하는 것만 큼 쉽게 숫자를 이동할 수 있다는 사실을 활용합니다. 우리가 그런 식으로 일을한다면, 그리고 작동의 결과는 항상 숫자의 숫자입니다. 그것은 우리가 문자열에서 원하는 것과 동일한 숫자 인 숫자이므로 '0'(또는 48 또는 0x30)을 추가하여 ASCII 문자로 변환합니다. .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top