我想編寫一個程序來比較兩個數中的1位數。我想比較任意兩個數字之間的位,以找出二進制數在1和0中的不同位置。換句話說,「異或」(XOR)關係。計數兩個數中的位數並比較[C]
一樣,如果22(其具有10110
二進制),並將其與15比較(其具有01111
二進制)
第一個是10110
。 第二個是01111
。
結果:11001
。
答案是25,但我想得到的是3有三個不同的1
s和0
s。
我想編寫一個程序來比較兩個數中的1位數。我想比較任意兩個數字之間的位,以找出二進制數在1和0中的不同位置。換句話說,「異或」(XOR)關係。計數兩個數中的位數並比較[C]
一樣,如果22(其具有10110
二進制),並將其與15比較(其具有01111
二進制)
第一個是10110
。 第二個是01111
。
結果:11001
。
答案是25,但我想得到的是3有三個不同的1
s和0
s。
要尋找不同的位,則需要XOR
值:
unsigned int first = 22;
unsigned int second = 15;
unsigned int result = first^second; // only the bits that are different
// will be set to 1 in result
要統計result
1位,你可以使用:
unsigned int CountBits(unsigned int n) {
unsigned int count = 0;
while(n) {
count += n & 0x01; // checks the least significant bit of n
// if the bit is 1, count is incremented
n >>= 1; // shift all bits of n one to the right
// if no 1 bits are left, n becomes 0 and the loop ends
}
return count;
}
unsigned int count = CountBits(result);
要做到這一點在一步:
unsigned int count = CountBits(first^second);
在某些系統上,可以使用POPCNT
指令代替。
更新 - 完整的示例:
#include <stdio.h>
unsigned int CountBits(unsigned int n) {
unsigned int count = 0;
while(n) {
count += n & 0x01;
n >>= 1;
}
return count;
}
int main(void) {
unsigned int first = 22;
unsigned int second = 15;
unsigned int result = first^second;
unsigned int count = CountBits(result);
printf("result: %u - count: %u\n", result, count);
return 0;
}
打印:
result: 25 - count: 3
或者一個額外的功能:
#include <stdio.h>
unsigned int CountBits(unsigned int n) {
unsigned int count = 0;
while(n) {
count += n & 0x01;
n >>= 1;
}
return count;
}
unsigned int CountDifferentBits(unsigned int n1, unsigned int n2) {
return CountBits(n1^n2);
}
int main(void) {
unsigned int count = CountDifferentBits(22, 15);
printf("Different bits count: %u\n", count);
return 0;
}
是的,我知道得到1位。我必須比較兩個數字看他們的位在各自的位置..假設如果兩個數字是相同的,那麼他們的位也是一樣的..要在這種情況下返回零.. –
@SagunPanthi - 是的,正如你在你說的問題,你需要對它們進行異或操作:int count = CountBits(第一個^秒);''會給你異或值的位數(如果它們相同則返回0)。 ('^'是XOR運算符) –
@SagunPanthi - 查看我的更新瞭解完整示例。 –
int count_bit(unsigned int x, unsigned int y){
int x1[31], y1[31];
unsigned int x_count = sizeof(x) * 8 - 1; /*x is of "unsigned int" type*/
unsigned int y_count = sizeof(y) * 8 -1;
for (int i = 0; i<=x_count; i++){
x1[i] = x << i;}
for (int j = 0; j<= y_count;j++){
y1[j] = y << j;}
while((i<= x_count) && (j<= y_count)){
if(x1[i] != y1[j]){
count++;
i++;
j++;
return count;}
else
return 0;
}
看看[位運算符(https://en.wikipedia.org/wiki/Bitwise_operations_in_C),嘗試實現的東西,如果你將有問題的,張貼的,我們會給你一個手.. – LPs
您可以選擇任何數量的位計算算法:http://stackoverflow.com/questions/109023/how-to-count-the-number-of-set-bits-in-a-32- bit-integer –
還有一堆關於亂碼黑客(包括計數位)的參考:https://graphics.stanford.edu/~seander/bithacks。html –