求32位int二进制下最左边的bit '1'
来源:互联网 发布:云霄生活网络 编辑:程序博客网 时间:2024/05/22 10:41
源地址:http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogDeBruijn
java 里就是用的这种方法。
#include <iostream>using namespace std;typedef unsigned int uint32_t;uint32_t highestOneBit(uint32_t v){ static const int MultiplyDeBruijnBitPosition[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 }; v |= v >> 1; // first round down to one less than a power of 2 v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; return MultiplyDeBruijnBitPosition[(uint32_t)(v * 0x07C4ACDDU) >> 27];}int main(){ cout <<"1 :" <<highestOneBit(1) << endl; cout << "4 :" << highestOneBit(4) << endl; cout << "1024 :" << highestOneBit(1024) << endl; cout << "1023 :" << highestOneBit(1023) << endl; return 0;}
这种更容易理解:
#include <iostream>using namespace std;typedef unsigned int uint32_t;uint32_t highestOneBit(uint32_t v){ static const char msb_256_table[256] = { 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,4, 4, 4, 4,4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, }; int result = 0; if (v > 0xFFFF) { v >>= 16; result += 16; } if (v > 0xFF) { v >>= 8; result += 8; } return (result + msb_256_table[v]);}int main(){ cout <<"1 :" <<highestOneBit(1) << endl; cout << "4 :" << highestOneBit(4) << endl; cout << "1024 :" << highestOneBit(1024) << endl; cout << "1023 :" << highestOneBit(1023) << endl; return 0;}
- 求32位int二进制下最左边的bit '1'
- 求两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- 在指定 int 值的二进制补码表示形式中最高位(最左边)的 1 位之前,返回零位的数量
- 找到int最左边的那个1
- 返回具有至多单个 1 位的 int 值,在指定的 int 值中最高位(最左边)的 1 位的位置
- 求出两个int(32位)整数m和n的二进制表达中,有多少bit位不同
- 求0左边必有1的二进制字符串数量
- 求二进制最右为1的位是第几位
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- 编程实现: 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- 编程实现: 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
- 如何实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- CTreeCtrl中Edit Label时Esc/Enter的处理
- Heap corruption decected error
- 策略模式C语言实现
- 关于提示”XML 文档只能有一个顶层元素“问题的解决方法备忘
- VIM 简易教程(4)
- 求32位int二进制下最左边的bit '1'
- 一些有用的js正则验证(是否为空,是否为正整数,email,手机,电话,身份证)
- 九度题库 (题目1462:两船载物问题)
- Linux命令行 基本命令应用
- socket头文件
- Linux so 选择顺序
- MySql与SqlServer的一些常用用法的差别
- NSArray使用小结
- 快速排序算法实现