今天遇到了一个问题,遇到一个32位的数据,写一个子函数来判断它的多少位是1。我的思路一开始是把这个数据变成一个32位容量的数组然后每个位去比较是不是1,如果是1,就用另一个变量加1.最后返回这个变量。
但是这样不对当而且也没有必要转成数组来做。
int count_bit (unsigned int a) { int counts=0; while (a) { counts += a & 0x1u ; a >>= 1 ; } return counts ; }
这个子函数,把想要判断的32位数据传入进来。然后先对计数值赋值0。然后是一个while循环来进行循环的判断,如果数据中都是0则不会进入while循环,计数值也会返回0。进入while循环以后,会把数据的最右边一位进行一个与运算,如果是1.则会使counts加1。
然后数据a向右移动一位进行下一位数的判断。直到32位数据都判断完。就会退出这个循环。
然后我定义了一个32位数据来验证这个函数的功能。
#include<inttypes.h > int count_bit (unsigned int a) { int counts=0; while (a) { counts += a & 0x1u ; a >>= 1 ; } return counts ; } void setup() { Serial.begin(9600); } uint32_t y=12341234; int b =count_bit(y); void loop() { Serial.print(b); delay(1000); }
判断出这个32位数据有10个位是1。