두 비트 패턴이 N 비트에서 다른지 테스트 할 수있는 방법 (위치는 중요하지 않음)

StackOverflow https://stackoverflow.com/questions/1502452

  •  19-09-2019
  •  | 
  •  

문제

이 비트 필드 값이 있다고 가정 해 봅시다. 10101001

다른 값이 다른 경우 어떻게 테스트합니까? n 비트. 직책을 고려하지 않고?

예시:

10101001
10101011 --> 1 bit different 

10101001
10111001 --> 1 bit different

10101001
01101001 --> 2 bits different

10101001
00101011 --> 2 bits different

이 비교를 많이해야하므로 주로 성능을 찾고 있지만 힌트는 매우 환영합니다.

도움이 되었습니까?

해결책

두 분야의 XOR을 가져 와서 결과의 인구 수를 수행하십시오.

다른 팁

두 값을 함께 xor하면 다른 비트 만 남습니다.

그런 다음 여전히 1 인 비트 만 계산하면 대답이 있습니다.

C :

 unsigned char val1=12;
 unsigned char val2=123;
 unsigned char xored = val1 ^ val2;
 int i;
 int numBits=0;
 for(i=0; i<8; i++)
 {
      if(xored&1) numBits++;
      xored>>=1;
 }

바이트에서 비트를 계산하는 더 빠른 방법이있을 수 있지만 (예를 들어 256 값에 보이는 경우를 사용할 수 있습니다).

다른 사람들이 말했듯이 XOR을 사용하여 다른 것이 무엇인지 결정하고 이 알고리즘 중 하나를 사용하여 계산하십시오.

이것은 값 사이의 비트 차이를 얻고 한 번에 비트 3을 계산합니다.

public static int BitDifference(int a, int b) {
   int cnt = 0, bits = a ^ b;
   while (bits != 0) {
      cnt += (0xE994 >> ((bits & 7) << 1)) & 3;
      bits >>= 3;
   }
   return cnt;
}

XOR 숫자를 숫자하면 문제가 결과에서 1을 계산하는 문제가됩니다.

Java :

Integer.bitCount(a ^ b)

다른 사람들이 이미 대답했듯이 XOR과 비교됩니다.

계산은 여러 가지 방법으로 수행 할 수 있습니다.

  • 왼쪽과 추가.
  • 테이블에서 조회.
  • 당신이 찾을 수있는 논리 공식 Karnaugh지도.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top