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

标签 c binary

我想我可能会让这有点复杂。我们应该传入一个 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/

相关文章:

c - "*pointer++"和 "(*pointer)++"有什么区别?

ruby - 在运行时检测 ruby​​ 二进制编译布局

支持二进制数据的javascript压缩算法?

c - 输出文件重定向(几乎)从不与我在 linux 中的 c 程序一起使用

c - 用FT245同步方式写入芯片

python-3.x - 带有 ASCII 文本头的二进制输入,从 stdin 读取

python - 使用带有 1 字节变量的 Python struct.unpack

java - Java中如何在位级别内部表示整数?

c - if 语句中只有变量名意味着什么

c - 通过 C 中的 MQTT 连接到 Google IoT 核心的问题