gpt4 book ai didi

c - 使用 Two 的补码 C 在数字中查找二进制数

转载 作者:行者123 更新时间:2023-12-02 06:50:23 24 4
gpt4 key购买 nike

我想我可能会让这有点复杂。我们应该传入一个 long,并以数字的二进制表示形式返回 1 的个数。对于负数,我们返回二进制补码。我有积极的工作,但二进制补码有点偏离。任何使这项工作可行的提示都将不胜感激。

unsigned int binaryOnesCounter(long n) {


unsigned int oneCounter, negCounter;
int binaryStorage[63];
int index, negFlag;

oneCounter = negFlag = index = 0;


int i;
for (i = 0; i < 63; ++i)
{
binaryStorage[i] = 0;
}

if(n < 0) {
if (n == -1){
oneCounter = 63 + 1;
} else {
/* negate and add 1*/
negFlag = 1;
n = (n * -1) + 1;
}
}
while (n>=1) {
if (n%2 == 1) {
oneCounter++;
binaryStorage[index] = 1;
}
else if (n%2 == 0) {
binaryStorage[index] = 0;
}
n = n/2;
}


if (negFlag == 1 && n != 1) {
negCounter = 64;
oneCounter = negCounter - oneCounter;
}
return oneCounter;
}

最佳答案

太复杂了

int countones(long long i)
{
int nOnes = 0;
unsigned long long *ptr = &i;

while (*ptr)
{
nOnes += *ptr & 1;
*ptr >>= 1;
}
return nOnes;
}

PS -4 有 62 个不是 63 0b111111111111111111111111111111111111111111111111111111111111100

这里有一个更通用的(几乎在任何对象中都算)

int getbit(void *obj, size_t bit);

size_t countBitsUniversal(void *obj, size_t osize)
{
size_t nOnes = 0, tmp = osize;
osize <<= 3;

if (osize && osize > tmp)
{
do
{
nOnes += getbit(obj, --osize);

} while (osize);
}
return nOnes;
}

int getbit(void *obj, size_t bit)
{
uint8_t *p = obj;

return !!(p[bit >> 3] & (1 << (bit & 7)));
}

__________
usage example


double x;
printf("%zu\n", countBitsUniversal(&x, sizeof(x)));

long long arr[100];
printf("%zu\n", countBitsUniversal(arr, sizeof(arr)));

关于c - 使用 Two 的补码 C 在数字中查找二进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46145484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com