那天的那个求数字位数的题目 我有一点延伸的想法 不知道有没有人有兴趣
那天感冒 我也没深究 我现在的问题是一个求数字二进制位数的函数 编译器是否会优化成支持二进制操作的指令?我的代码在GCC下没有这么优化 那么
1 怎么写才能让编译器优化成那样?
2 是不是VC编译出来的代码用了那些指令?
我写的C语言版和汇编版如下
程序代码:
//gcc -Wall -march=corei7-avx -Ofast -msse4.2 -mavx -masm=intel -std=c99 how_many_bits.c -lm -o how_many_bits
#include <stdio.h>
int bits_of_n(unsigned int num)
{
#define MAX_BITS 32
unsigned int mask = 1 << (MAX_BITS - 1);
int bits = 0;
if (num == 0)
{
return 0;
}
while (bits < MAX_BITS)
{
if ((num & mask) != 0)
{
return (MAX_BITS - bits);
}
else
{
bits++;
mask >>= 1;
}
}
return -1;
}
int bits_of_n_asm(unsigned int num)
{
int bits = 0;
__asm__ (".intel_syntax noprefix");
__asm__ (
"bsr %0, %1;"
: "=r" (bits) //dst
: "r" (num) //src
: "eax", "ecx"
);
return (bits + 1);
}
int main(void)
{
unsigned int num = 0;
scanf("%d", &num);
printf("%d has %d bit(s)\n", num, bits_of_n(num));
printf("%d has %d bit(s)\n", num, bits_of_n_asm(num));
return 0;
}
当然这是GCC的 VS在64已经不支持内嵌汇编了









