| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 497 人关注过本帖
标题:那天的那个求数字位数的题目 我有一点延伸的想法 不知道有没有人有兴趣
只看楼主 加入收藏
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:7 
那天的那个求数字位数的题目 我有一点延伸的想法 不知道有没有人有兴趣
那天感冒 我也没深究 我现在的问题是

一个求数字二进制位数的函数 编译器是否会优化成支持二进制操作的指令?我的代码在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已经不支持内嵌汇编了
搜索更多相关主题的帖子: include 编译器 二进制 C语言 
2014-07-25 16:49
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:50 
这东东有啥用处吗?

总有那身价贱的人给作业贴回复完整的代码
2014-07-25 16:56
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用embed_xuel在2014-7-25 16:56:54的发言:

这东东有啥用处吗?

突然想到了 至于用处 应该是有罢
2014-07-25 17:41
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
我测试了一下 用我的那个能快一点 快(3063-2672)/3063*100%=12.765%
2014-07-25 17:49
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:50 
回复 2 楼 embed_xuel
应该是有
2014-07-25 18:39
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
没人感兴趣
2014-07-26 14:12
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
我没有试验,但粗看起来,你的这两个函数所求不一样,第一个函数是求1的数目,第二个函数是求1的位置

bsr指令在VC中是
#include <intrin.h>
#pragma intrinsic(_BitScanReverse)
unsigned char _BitScanReverse( unsigned long * Index, unsigned long Mask );

如果是求1的数目,还可以这么做
程序代码:
unsigned long func(unsigned long x)
{
    x = (x & 0x55555555UL) + ((x >> 1) & 0x55555555UL);
    x = (x & 0x33333333UL) + ((x >> 2) & 0x33333333UL);
    x = (x & 0x0f0f0f0fUL) + ((x >> 4) & 0x0f0f0f0fUL);
    x = (x & 0x00ff00ffUL) + ((x >> 8) & 0x00ff00ffUL);
    x = (x & 0x0000ffffUL) + ((x >> 16) & 0x0000ffffUL);
    return x;
}

2014-07-28 08:50
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用rjsp在2014-7-28 08:50:20的发言:

我没有试验,但粗看起来,你的这两个函数所求不一样,第一个函数是求1的数目,第二个函数是求1的位置

bsr指令在VC中是
#include
#pragma intrinsic(_BitScanReverse)
unsigned char _BitScanReverse( unsigned long * Index, unsigned long Mask );

如果是求1的数目,还可以这么做
unsigned long func(unsigned long x)
{
    x = (x & 0x55555555UL) + ((x >> 1) & 0x55555555UL);
    x = (x & 0x33333333UL) + ((x >> 2) & 0x33333333UL);
    x = (x & 0x0f0f0f0fUL) + ((x >> 4) & 0x0f0f0f0fUL);
    x = (x & 0x00ff00ffUL) + ((x >> 8) & 0x00ff00ffUL);
    x = (x & 0x0000ffffUL) + ((x >> 16) & 0x0000ffffUL);
    return x;
}


GCC里面是这个
int __builtin_clz (unsigned int x)
Returns the number of leading 0-bits in x, starting at the most significant bit position.
If x is 0, the result is undefined.
我试了试 速度最快 比内联汇编快
2014-07-30 13:00
快速回复:那天的那个求数字位数的题目 我有一点延伸的想法 不知道有没有人有兴趣 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043660 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved