开发者社区> 问答> 正文

请问C语言中位运算有什么用啊,一般都在哪些项目会使用到?

已解决

想了解一下位运算的用途,希望大神们能帮我解惑。

展开
收起
友人-a 2017-11-30 20:49:55 5273 0
6 条回答
写回答
取消 提交回答
  • 采纳回答

    位运算速度比较快,移位就可以,对性能要求比较高的算法或逻辑会常用

    2019-07-17 21:46:50
    赞同 1 展开评论 打赏
  • 软件开发,安全加密

    节省内存,单片机中使用较多

    2019-07-17 21:46:51
    赞同 展开评论 打赏
  • 乐于学习与分析

    节省内存,单片机中使用较多

    2019-07-17 21:46:51
    赞同 展开评论 打赏
  • 有意思的问题,我来小答一下,以抛砖引玉。
    目前我所知道的有两个:
    第一种情况: 如上面同学所说,提升运算速度。
    举个例子:
    int i = 2;
    int k = i * 1024;

    上面这个例子,在计算 k 的值,一般我们都会这么写。
    这么写有问题吗?
    当然没有问题,还相当标准。
    但是这么写对性能没有什么帮助,如果我们清楚位运算会更快,那么驱动或者硬件的老手就会这么写:
    k = i << 10;

    当然性能上,对于大型服务器,不会因为你写了这么一句话,就会提升很多,但是如果是单片机的话,可能就会快很多。
    还有人问,大部分我可能不是 乘以 1024,而是 乘以 1000,这种情况岂不是不行了。

    我回答是:分情况。如果你的数值是约数,不需要精确的话,那么你依然可以这么写,如果是需要精确数值的话,恐怕不行。

    第二种情况:减少内存损耗,好吧,也是因为单片机的原因。
    举个例子:如果我有 4096 个成员,要标志,4096 个成员,是男是女(比如 1 是男,0 是女),大部分情况下,我们会这么写:
    unsigned char member[4096]
    内存损耗为 sizeof(member) == 4096 个字节

    但是如果我们可以这么定义:
    uint32_t member[128]
    内存损耗为 sizeof(member) == 128 * 4 = 512 个字节 = 4096 位
    也就是说,每一位代表一个成员的性别,1 是男,0 是女,是不是会节省很多内存呢?

    2019-07-17 21:46:51
    赞同 展开评论 打赏
  • 一个简单的应用:设计options。比如,网络状态

    typedef NS_OPTIONS(NSUInteger, NetworkOptions) {

    Network_None = 0,
    Network_2G = 1<1,
    Network_3G = 1<2,
    Network_4G = 1<3,
    Network_wifi = 1<4,

    };

    当需要在弱网或无网状态下进行某些操作,那么可以用Network_None|Network_2G|Network_3G表示

    2019-07-17 21:46:50
    赞同 1 展开评论 打赏
  • 一名路过的小码农,大神请多多指教

    在java里面位运算你可以看下Integer类中的几个方法,几乎大部分都是用的位运算,因为位运算是在硬件层面就可以直接计算的所以更快,如果采用简单的迭代和加减乘除的话效率不在一个层级

    2019-07-17 21:46:50
    赞同 展开评论 打赏
滑动查看更多
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
为什么要学函数式编程? 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载