首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用位运算符除以10和模10

用位运算符除以10和模10
EN

Stack Overflow用户
提问于 2022-09-24 12:31:35
回答 1查看 97关注 0票数 0

我正在用传统的学校算术技术来计算2^p,乘以2,如果> 9,我写了两行代码,用位运算符返回n/ 10和n% 10。当乘数为2:最大数为(2 * 9) + 1时,这些方法都是精确的。但是,这种方法从20开始是不准确的,而不需要。这些技术加快了节目的速度。

因为我想确定我是否正确地使用了C,这一技术是好的实践吗?

代码语言:javascript
复制
#include <stdio.h>

int main(void) {

    unsigned int d, m;

    /* division by 10 */
    for (int i=0; i<20; ++i) {
        d = (i + 6) >> 4;
        printf("%u ", d);
    }
            
    printf("\n");
            
    /* modulus 10 */
    for (int i=0; i<20; ++i) {
        m = i - (((i + 6) >> 4) * 10);
        printf("%u ", m);
    }
                
    printf("\n");
    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2022-09-24 13:03:20

这不是很好的做法。

如果您编译按常量除法或模数并启用优化的代码,则编译器将在可能且等效时为您执行此操作(在检查、gcc uses a somewhat more complicated set of imul, shifts and a subtraction而不是整数除法指令时;比您编写的代码更昂贵,但仍然比整数除法便宜得多)。而且您的代码不会是一个不可读的混乱,当传递的值甚至稍微超出其设计参数时,它就会中断。

在非常罕见的情况下,您可能会这样做,如果

  1. 分析表明,所讨论的代码是阻碍您的代码获得足够性能的瓶颈,而调整优化级别不足以修复它,而
  2. 则说明了您正在做的事情,包括对输入的限制和执行

的理由。

但在这种情况下,您永远不希望编写不可读、不可维护、易碎的代码,只为了缩短几个周期。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73837240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档