那天的那个求数字位数的题目 我有一点延伸的想法 不知道有没有人有兴趣
那天感冒 我也没深究 我现在的问题是一个求数字二进制位数的函数 编译器是否会优化成支持二进制操作的指令?我的代码在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已经不支持内嵌汇编了