在C语言中,将int转换为二进制表示的最快方法是什么?
例如,6=>[1,1,0]我不知道,但我会做一些类似的事情在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)
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
unsigned x = number;
char buf[sizeof(int)*CHAR_BIT+1], *p=buf+sizeof(buf);
for (*--p=0; x; x>>=1) *--p='0'+x%2;