求 统计高位 和 低位 的零统计函数

取个昵称真难吖 2015-12-05 06:10:07
GCC 里有两个高效的高位零统计 和 低位 零统计函数
__builtin_clz(统计最高位0的个数)
__builtin_ctz(统计低位0的个数)

VC 里面有没有这两个相同功能的替代函数?
...全文
214 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
呵呵,zwfgdlc 都已经把代码贴出来了。 我把这两个测试代码贴出来供遇到同样问题的人直接用。 输出的值和GCC版本是一致的,可直接替换
// ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <bitset>

using namespace std;


__inline int __builtin_clz(int v)
{
    if (v == 0)
        return 31;

    __asm
    {
        bsr ecx, dword ptr[v];
        mov eax, 1Fh;
        sub eax, ecx;
    }
}

__inline int __builtin_ctz(int v)
{
    int pos;
    if (v == 0)
        return 0;

    __asm
    {
        bsf eax, dword ptr[v];
    }
}
             
int main()
{
    // clz
    printf("__builtin_clz:\n");
    for (int i = 0; i < 32; i++) {
        int v = 1 << i;
        bitset<32> b(v);
        printf("%12u(%s): %2d  %s \n", v, b.to_string().c_str(), __builtin_clz(v), __builtin_clz(v) == 31 - i ? "OK" : "Err");
    }
    printf("\n");

    // ctz
    printf("__builtin_ctz:\n");
    for (int i = 0; i < 32; i++) {
        int v = 1 << i;
        bitset<32> b(v);
        printf("%12u(%s): %2d  %s \n", v, b.to_string().c_str(), __builtin_ctz(v), __builtin_ctz(v) == i ? "OK" : "Err");
    }

    return 0;
}

sking2008 2015-12-07
  • 打赏
  • 举报
回复
自己写个,顶你 ……
  • 打赏
  • 举报
回复
各位大大好牛 本考虑到各方面原因,用平台提供会比较可靠些。看来VC 是没有的了,只能自己嵌个汇编。
  • 打赏
  • 举报
回复
哦~~ 原来VC有,那就最好了,直接用系统。
zwfgdlc 2015-12-07
  • 打赏
  • 举报
回复
zwfgdlc 2015-12-06
  • 打赏
  • 举报
回复

	int a = 1234; //10011010010
	int lBitPos, hBitPos;

	__asm
	{
		bsr eax, dword ptr[a]
		mov hBitPos, eax //高位1,从右至左数在10位(0,1,2...10)
		bsf eax, dword ptr[a]
		mov lBitPos, eax //低位1,从右至左数在2位(0,1)
	}
worldy 2015-12-06
  • 打赏
  • 举报
回复
不就是计算二进制0的个数吗?用嵌入汇编写一下
schlafenhamster 2015-12-06
  • 打赏
  • 举报
回复
参考 bt opd, ops
schlafenhamster 2015-12-06
  • 打赏
  • 举报
回复
BSR-逆向位扫描指令,BSF - 正向位扫描 格式: BSF dest, src 影响标志位: ZF 功能:从源操作数的的最低位向高位搜索,将遇到的第一个“1”所在的位序号存入目标寄存器中, 若所有位都是0,则ZF=0,否则ZF=1。 格式: BSF dest, src 影响标志位: ZF 功能:从源操作数的的最高位向低位搜索,将遇到的第一个“1”所在的位序号存入目标寄存器中, 若所有位都是0,则ZF=0,否则ZF=1。
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
应该没有的,lz自己写一个函数被
这两个函数在radix tree中直接计算索引,对性能有一定要求。 自己写有些效率问题不是很理想,所以想确定vc2015 版本中是否有带已经优化过的函数。
worldy 2015-12-05
  • 打赏
  • 举报
回复
应该没有的,lz自己写一个函数被

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧