// // Created by aurora on 2024/9/16. // #include #include #include #define ASSERT(x, expect) \ do \ { \ int retSize; \ int *ret; \ ret = countBits(x, &retSize); \ for (int i = 0; i < retSize; i++) \ assert(ret[i] == expect[i]); \ free(ret); \ } while (0) int *countBits(int n, int *returnSize) { *returnSize = n + 1; int *ret = (int *)malloc(sizeof(int) * (*returnSize)); ret[0] = 0; for (int i = 1; i <= n; i++) { ret[i] = ret[i >> 1] + (i & 1); // equal to the following expression // if (i % 2 == 0) // ret[i] = ret[i / 2]; // else // ret[i] = ret[i - 1] + 1; } return ret; } int main() { int t1[] = {0, 1, 1}; ASSERT(2, t1); int t2[] = {0, 1, 1, 2, 1, 2}; ASSERT(5, t2); return 0; }