2009-06-16 4 views
1

나는이 같은 오래된 코드 : 나는받지 못했습니다,비트 C#으로 혼란을 이동

private int ParseByte(byte theByte) 
{ 
     return theByte >> 7; 
} 

을하지만 :

private int ParseByte(byte theByte) 
{ 
     byte[] bytes = new byte[1]; 
     bytes[0] = theByte; 
     BitArray bits = new BitArray(bytes); 

     if (bits[0]) 
      return 1; 
     else 
      return 0; 
} 

그것은 오랫동안 그리고 내가 같이 내려 트림 수 생각 첫 번째 함수와 동일한 값. 바이트에는 00000000 또는 10000000이 포함됩니다. 여기에 무엇이 누락되어 있습니까? 잘못된 연산자를 사용하고 있습니까?

답변

4

첫 번째 함수에서 bits [0]은 최하위 비트를 반환하지만 두 번째 함수는 최상위 비트를 반환합니다. 최하위 비트를 얻기 위해 두 번째 함수를 수정하려면 :

private int ParseByte(byte theByte) 
{ 
    return theByte & 00000001; 
} 

는 최상위 비트를 반환하는 최초의 기능을 수정하려면 사용한다 비트 [7] -하지 비트 [0]. 당신이 가장 표시하는 비트를 chechink 된 두 번째 snipet에서

return theByte & 1 == 1 

첫 번째 snipet에서 최하위 :

+0

그래, 내가 데이터를 보았던 16 진수 편집기는 그것을 10000000으로 표시했다. 나는 lsb를 먼저 표시했다고 생각한다? 그리고 BitArray에 혼란스러워서 운이 좋았나요? – scottm

+0

@ scott2012 : 16 진수 편집기는 말할 수 없지만 BitArray가 작동하는 방식입니다. 최하위 비트는 인덱스 0에 있습니다. 코드의 짧은 비트로 확인할 수 있습니다. var bits = new BitArray 새로운 바이트 [] {0xf0}); // 11110000 for (int idx = 0; idx <= 7; idx ++) Console.WriteLine ("{0} : {1}", idx, bits [idx]); –

0

아마도 첫 번째 함수는 비트 [7]를 확인해야할까요?

+0

첫 번째 함수는 내가 원하는 것을 가져오고, 두 번째 함수는 작동하지 않습니다. – scottm

+0

다음 작업을 수행하십시오. return ((int) theByte == 128)? 1 : 0; –

0

이진수에 0이 추가됩니다 (각각 9 자리수). 나는 그저 오타라고 추측하고있다.

주문을 올바르게 하시겠습니까? 바이너리는 전통적으로 대부분의 다른 번호 매기기 시스템처럼 왼쪽에서 오른쪽으로 쓰지 않고 오른쪽에서 왼쪽으로 쓰여집니다. 표시 한 이진수가 속성 형식 인 경우 (즉, 은 실제로 128이고 숫자는 1이 아님) 첫 번째 코드가 작동하지 않아야하며 두 번째 코드가 올바르게 작동해야합니다. 역순으로 쓰는 경우 (100000001이 아니고 128이 아님) 비트 시프트 할 필요가 없습니다. 그냥 1 (theByte & 1)과 함께 사용하십시오.

사실 관계없이 비트 AND (& 연산자)가 더 적합합니다. 첫 번째 함수가 작동하고 두 번째 함수가 작동하지 않는다고 가정 할 때, 여러분은 방금 숫자를 거꾸로 쓴 것으로 가정하고 위에서 설명한대로 1과 AND해야합니다.

+0

은 오타가 수정되었습니다. 나는 그것을 뒤에서 쓰지 않고있다. 내가 읽는 바이너리 데이터의 형식이다. 왜 그런 식으로했는지 나는 모른다. 나는 시도 할 것이다 & – scottm

0

Microsoft's site의 사용자에 따르면 BitArray는 내부적으로 비트를 빅 엔디 언으로 Int32s에 비트 순서로 저장합니다. 그게 문제를 일으킬 수 있습니다. 솔루션 및 추가 정보를 보려면 링크를 방문하십시오.

3

첫 snipet에 해당하는 기능입니다.

0

첫 번째 첫 번째 함수는 int 대신 문자열을 반환하려고 시도하므로 작동하지 않습니다.

private static int ParseByte(byte theByte) 
    { 
     return theByte & 1; 
    } 

그러나 당신은 또한이 할 수 있습니다 :

은 그러나 당신이 할 수 있습니다 것은 이것이다

private static string ParseByteB(byte theByte) 
    { 
     return (theByte & 1).ToString(); 
    } 
+0

오타가 수정되었습니다. – scottm

1

당신이 INT 또는 문자열 반환 하시겠습니까? 어쨌든 - 모듈을 사용할 수 있습니다 :

return theByte % 2 == 0 ? "0" : "1" 

좋아, 편집 ...int로 돌아가고 싶습니다

이동 조작에 대한 단어 : >> 대신 < <을 사용해야합니다.

return (byte)(theByte << 7) == 128 ? 1 : 0; 

그러나 다른 답변은 이것보다 정말 더 나은 솔루션을 포함 : (대신 INT의 바이트 캐스팅 할 때) 그러나이 0 또는 128가 아니라 0 또는 1 그래서 당신은 당신의 두 번째 솔루션을 다시 작성할 수 반환합니다.

관련 문제