Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中,将int转换为二进制表示的最快方法是什么?_C - Fatal编程技术网

在C语言中,将int转换为二进制表示的最快方法是什么?

在C语言中,将int转换为二进制表示的最快方法是什么?,c,C,例如,6=>[1,1,0]我不知道,但我会做一些类似的事情 int[32] bits = {}; int value = 255; int i = 0; while (value) { bits[i++] = value & 1; value = value >> 1; } 我不知道,但我会做一些 int[32] bits = {}; int value = 255; int i = 0; while (value)

例如,6=>[1,1,0]

我不知道,但我会做一些类似的事情

int[32] bits = {};
int     value = 255;
int     i = 0;

while (value)   
{
  bits[i++] = value & 1;
  value = value >> 1;
}

我不知道,但我会做一些

int[32] bits = {};
int     value = 255;
int     i = 0;

while (value)   
{
  bits[i++] = value & 1;
  value = value >> 1;
}

一种简单而快速的方法是使用无符号整数作为光标,并移动它以使光标前进:

1000000000000000
0100000000000000
0010000000000000
0001000000000000
0000100000000000
0000010000000000
0000001000000000
0000000100000000
...
在每次迭代中,使用bitwise&查看数字和光标是否共享任何公共位

一个简单的实现:

// number of bits in an unsigned int
#define BIT_COUNT (CHAR_BIT * sizeof(unsigned int))

void toBits(unsigned int n, int bits[BIT_COUNT])
{
    unsigned int cursor = (unsigned int)1 << (BIT_COUNT - 1);
    unsigned int i;

    for (i = 0; i < BIT_COUNT; i++, cursor >>= 1)
        out[i++] = (n & cursor) ? 1 : 0;
}

一种简单而快速的方法是使用无符号整数作为光标,并移动它以使光标前进:

1000000000000000
0100000000000000
0010000000000000
0001000000000000
0000100000000000
0000010000000000
0000001000000000
0000000100000000
...
在每次迭代中,使用bitwise&查看数字和光标是否共享任何公共位

一个简单的实现:

// number of bits in an unsigned int
#define BIT_COUNT (CHAR_BIT * sizeof(unsigned int))

void toBits(unsigned int n, int bits[BIT_COUNT])
{
    unsigned int cursor = (unsigned int)1 << (BIT_COUNT - 1);
    unsigned int i;

    for (i = 0; i < BIT_COUNT; i++, cursor >>= 1)
        out[i++] = (n & cursor) ? 1 : 0;
}

要读取位,可以使用

char get_bit(unsigned int n, int bit_num){
    if (bit_num < 0 || bit_num >= sizeof(int) * CHAR_BIT)
        return -1;
    return (n >> bit_num) & 1;
};

它的主要问题是速度不快,但OP甚至没有指定他想要的是数字还是数字

char get_bit(unsigned int n, int bit_num){
    if (bit_num < 0 || bit_num >= sizeof(int) * CHAR_BIT)
        return -1;
    return (n >> bit_num) & 1;
};
unsigned x = number;
char buf[sizeof(int)*CHAR_BIT+1], *p=buf+sizeof(buf);
for (*--p=0; x; x>>=1) *--p='0'+x%2;


它的主要问题是速度不快,但OP甚至没有指定他想要的是数字还是数字。

这还不清楚。int是位可寻址的。你的意思是打印出位模式吗?你能更具体地解释一下位表示法是什么意思吗?我想他指的是二进制表示法。是的。更正了标题,是作业吗?C已经使用二进制表示。你是说怎么去?这还不清楚。int是位可寻址的。你的意思是打印出位模式吗?你能更具体地解释一下位表示法是什么意思吗?我想他指的是二进制表示法。是的。更正了标题,是作业吗?C已经使用二进制表示。你是说怎么去做?@6502:我想是一个小的无限循环,后面是一个分段错误。它会返回一个满是1的数组。@ruslik,它不会进入无限循环。记住移位是如何工作的。该标准没有指定对有符号值使用哪个右移位。另外,x86编译器使用算术移位。将值声明为无符号以避免它。@6502:我想是一个小的无限循环,后跟一个分段错误。它将返回一个满1的数组。@ruslik,它不会进入无限循环。记住移位是如何工作的。该标准没有指定对有符号值使用哪个右移位。另外,x86编译器使用算术移位。将值声明为unsigned以避免它。我喜欢这个答案:很好而且简单,甚至可能优化为本机位测试指令。然而,有几个小细节:1。char在某些体系结构上是无符号的,因此返回-1可能会在这些体系结构上产生255个字符,2。返回一个char通常并不比返回一个int好多少,因为C语言倾向于提升事物,3。如果我是我,我可能只会assertbit\u num>=0&&bit\u num=0&&bit\u numunsigned x = number; char buf[sizeof(int)*CHAR_BIT+1], *p=buf+sizeof(buf); for (*--p=0; x; x>>=1) *--p='0'+x%2;