也就是最高位的1在第几位,例如4就是0x100,3位,3就是0x11,2位,找了一圈没找到这个的算法啊
解决方案
15
#include <intrin.h>
_BitScanReverse
_BitScanReverse64
注意结果位序是0起始的。
good good study, day day up
_BitScanReverse
_BitScanReverse64
注意结果位序是0起始的。
good good study, day day up
15
x86 BSF/BSR
ARM CTZ/CLZ
ARM CTZ/CLZ
5
《The Intel 64 and IA-32 Architectures Software Developer”s Manual》
5
汇编语言,X86有指令可用,C,C++ 可以直接嵌入汇编
C,C++本身,使用位运算:
//32Bits 用位运算
int Bitsof(unsigned x){
x =(x&0x55555555) +((x&0xAAAAAAAA)>>1);//错1位相加
x =(x&0x33333333) +((x&0xCCCCCCCC)>>2);//错2位相加
x=(x&0x0F0F0F0F) +((x&0xF0F0F0F0)>>4);//错4位相加
x=(x&0x00FF00FF) +((x&0xFF00FF00)>>8);//错8位相加
x=(x&0x0000FFFF) +((x&0xFFFF0000)>>16);//错16位相加
return x;
}
C,C++本身,使用位运算:
//32Bits 用位运算
int Bitsof(unsigned x){
x =(x&0x55555555) +((x&0xAAAAAAAA)>>1);//错1位相加
x =(x&0x33333333) +((x&0xCCCCCCCC)>>2);//错2位相加
x=(x&0x0F0F0F0F) +((x&0xF0F0F0F0)>>4);//错4位相加
x=(x&0x00FF00FF) +((x&0xFF00FF00)>>8);//错8位相加
x=(x&0x0000FFFF) +((x&0xFFFF0000)>>16);//错16位相加
return x;
}