2013-05-16 3 views
0

C#에서 일부 코드를 분석하려고합니다. 변환 숫자에 대한 오해의 문제가 있고 C# 코드의 AND 연산과 함께있을 수 있습니다. 나는 아래와 같은 코드를 가지고있다.내 C 코드에서 AND 또는 OR 연산에 대한 설명

 public void SerialNumber(UInt32 number) 
    { 
     _sensorNumber=0; 
     if (number == 0) 
      number = (UInt32)(USB.Id << 16) | (_sensorNumber << 10) | 1; 

     SerialNumber = string.Format("{0}-{1}-{2}", 
      (number & 0xFFFF0000) >> 16, 
      (number & 0x0000FC00) >> 10, 
      number & 0x000003FF); 
    } 

이 코드는 어떤 점을 분명히 설명 할 수 있습니까? "SerialNumber"줄에 설명이 필요합니다. 이 코드를 디버깅하려고 할 때 두 가지 상황을 관찰하고 있습니다.

1) 숫자가 65668097 인 경우 1) 다음 내가 무엇입니까 "의 serialNumber = 1002-0-1

2) 내가 수 = 0이있을 때하며 그것은 점점 USB.Id = 15,152, 그리고 그 후 나는 작업이 걸리는 것을 이해하지 못했다 그때 마침내 번호 = 993001473 그때 나는 "SerialNumber = 15152-0-1을 얻고있다

제발 아무도 나에게 어떤 일이 일어 났는지 설명 할 수 없다.

답변

2

&|또는 각각의 논리적이다. 즉, 두 숫자를 사용하면 비트 표현이 논리적으로 비교되고 결과가 나타납니다. 예컨대 :

101,011 및 110,010 = 100,010

101011 또는 = 111,011

>> 110010 조금 이동 연산자와 수행해야 얼마나 많은 변화 알려줍니다 다음 수입니다. 여기에서 읽을 수 있습니다 : http://www.blackwasp.co.uk/CSharpShiftOperators.aspx

시작하는 데 도움이되기를 바랍니다.

편집 : 당신이 모르는 경우. 0xFFFF0000은 숫자의 16 진수 표현입니다. 여기에 대해 자세히 알아보기 : http://en.wikipedia.org/wiki/Hexadecimal

0

해당 코드를 더 잘 이해하려면 16 진수 형식의 숫자를보고 싶을 수 있습니다.

일련 번호 (숫자 또는 문자열)는 USB ID, 센서 번호 및 기타 3 가지 항목의 조합입니다 (단일 정수로 인코딩). USB ID는 처음 16 비트를 차지하고 센서 번호는 다음 6이며 마지막 부분은 10 비트 (16 + 10 + 6 = 32 비트 = sizeof (UInt32))에 있습니다. 0xFFFF0000은 처음 16 비트 (0xFFFF = 2^16-1), 다음 6에 대해서는 0xFC00, 마지막 10 비트에 대해서는 0x3FF (0x3FF = 1023 = 2^10-1, 0xFFFF = 0xFC00 + 0x3FF).

요약하면 "비트 AND"(&)는 전체 정수에서 세 부분을 분리하는 데 사용되며 "비트 OR"(|)은 해당 부분의 번호를 다시 구성합니다.

+0

이 함수는 적절한 입력 값을 요구하지만 0은 적절한 입력이 아니므로 현재의 USB ID ('USB.Id')에서 기본 시리얼'number'가 생성됩니다. 이것이 비트 OR이 사용되는 라인에 대한 설명입니다. – Liviu