我想提取一个十进制数的位.

例如,7是二进制0111,我想获取0 1 1 1所有存储在bool中的位.我怎样才能做到这一点呢?

好的,循环不是一个好的 Select ,我能为这个做点别的吗?

推荐答案

如果你想要n的第k位,那就做吧

(n & ( 1 << k )) >> k

在这里,我们创建一个掩码,将掩码应用于n,然后右移掩码值以获得我们想要的位.我们可以更完整地写出来:

    int mask =  1 << k;
    int masked_n = n & mask;
    int thebit = masked_n >> k;

您可以阅读更多关于位掩码here的内容.

以下是一个程序:

#include <stdio.h>
#include <stdlib.h>

int *get_bits(int n, int bitswanted){
  int *bits = malloc(sizeof(int) * bitswanted);

  int k;
  for(k=0; k<bitswanted; k++){
    int mask =  1 << k;
    int masked_n = n & mask;
    int thebit = masked_n >> k;
    bits[k] = thebit;
  }

  return bits;
}

int main(){
  int n=7;

  int  bitswanted = 5;

  int *bits = get_bits(n, bitswanted);

  printf("%d = ", n);

  int i;
  for(i=bitswanted-1; i>=0;i--){
    printf("%d ", bits[i]);
  }

  printf("\n");
}

C++相关问答推荐

如何从TPS特定的TGPT_PUBLIC数据 struct 中以OpenSSL的EVP_PKEY

为什么海湾合作委员会在共享对象中的. init_data的虚拟内存地址之前留出一个空白

如何避免重新分配指针数组时,我们从一开始就不知道确切的大小

为什么可以通过指向常量int的指针间接地改变整数的值?

为什么在Linux(特别是Ubuntu 20.04LTS)上,POSIX共享内存对象在重启后仍然存在,然后突然变成了根用户?

无效指针值在函数调用之间莫名其妙地改变

GLIBC:如何告诉可执行文件链接到特定版本的GLIBC

为什么net/if.h在ifaddrs.h之前?

_泛型控制表达式涉及数组碰撞警告的L值转换错误?

使用错误的命令执行程序

Flose()在Docker容器中抛出段错误

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

使用TCL C API导航到列表中的元素

生产者消费者计数器意外输出的C代码

隐藏测试用例无法在c程序中计算位数.

无算术运算符和循环的二进制乘法

在Ubuntu上使用库部署C程序的最佳实践

与指针的原始C数组或C++向量<;向量<;双>>;

使用共享变量同步多线程 C 中的函数

如何正确探测平台设备?