두 비트 패턴이 N 비트에서 다른지 테스트 할 수있는 방법 (위치는 중요하지 않음)
-
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지도.
제휴하지 않습니다 StackOverflow