移位运算「建议收藏」

移位运算「建议收藏」【1】示例代码项目应用示例:【2】分析图解移位运算分析:【3】移位运算位运算应用口诀:清零取位要用与,某位置一可用或;若要取反和交换,轻轻松松用异或。【4】与移位运算有关的操作符优先级问

大家好,又见面了,我是你们的朋友全栈君。

【1】示例代码

项目应用示例:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 #define CYCLE_DATA_KEY(baseCycleId, type, elementId)            (((baseCycleId) << 16) | ((type) << 14) | ((elementId) << 8))
 5 #define BASE_CYCLE_ID(dataKey)                                  (((dataKey) >> 16) & 0xFFFF)
 6 #define DATA_TYPE(dataKey)                                      (((dataKey) >> 14) & 0x3)
 7 #define ELEMENT_ID(dataKey)                                     (((dataKey) >> 8) & 0x3F)
 8 
 9 void main()
10 {
11     int nConfig = CYCLE_DATA_KEY(2, 2, 2);
12     cout << "nConfig :: " << nConfig << endl;
13     cout << "BASE_CYCLE_ID :: " << BASE_CYCLE_ID(nConfig) << endl;
14     cout << "DATA_TYPE :: " << DATA_TYPE(nConfig) << endl;
15     cout << "ELEMENT_ID :: " << ELEMENT_ID(nConfig) << endl;
16     system("pause");
17 }
18 
19 // run out:
20 /*
21 nConfig :: 164352
22 BASE_CYCLE_ID :: 2
23 DATA_TYPE :: 2
24 ELEMENT_ID :: 2
25 请按任意键继续. . .
26 */

【2】分析图解

移位运算分析:

移位运算「建议收藏」

 

【3】移位运算

位运算应用口诀:

清零取位要用与,某位置一可用或;若要取反和交换,轻轻松松用异或。

【4】与移位运算有关的操作符优先级问题

示例代码如下:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void main()
 5 {
 6     cout << "value1 :: " << (1 << 2 + 3 << 4) << endl;
 7     cout << "value2 :: " << (1 << 2) + (3 << 4) << endl;
 8     system("pause");
 9 }
10 
11 // run out:
12 /*
13 value1 :: 512
14 value2 :: 52
15 请按任意键继续. . .
16 */

常常有人会写这样的表达式:1 << 2 + 3 << 4,其本意是(1 << 2) + (3 << 4)。

但在C语言中,前面的表达式等价于1 << (2 + 3) << 4,这是由于加法(和减法)的优先级比移位运算要高。

然后,按照从左至右结合性规则,括号应该是这样打的(1 << (2 + 3)) << 4,因此得到的结果是512,而不是期望的52。

在C表达式中搞错优先级是一种常见的程序错误,而且常常很难检查出来。所以当你拿不准的时候,请加上括号!

 

Good Good Study, Day Day Up.

顺序 选择  循环 总结

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154425.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • redis6.0 源码学习(五)ziplist

    redis6.0源码学习(五)ziplist文章目录redis6.0源码学习(五)ziplist一、数据结构二、代码解析1、创建2、查找3、插入三、总结一、数据结构ziplist是经过特殊编码的双向链接列表,该列表具有很高的内存效率。它存储字符串和整数值,其中整数被编码为实际整数,而不是一系列个字符。它允许对列表的两侧进行push和pop操作且复杂度为O(1)。但是由于每个操作都需要重新分配ziplist使用的内存,实际复杂度与ziplist使用的内存量有关。下图是ziplist得示意图:

    2022年4月15日
    90
  • vm安装centos7蓝屏「建议收藏」

    vm安装centos7蓝屏「建议收藏」vm安装centos7蓝屏最近有同学购买了最新款英特尔11代的笔记本,使用vm安装centos7系统

    2022年9月26日
    5
  • 关于sources.list和apt-get [转载]

    关于sources.list和apt-get [转载]

    2021年11月16日
    52
  • url的加密解密_url地址加密

    url的加密解密_url地址加密今天做项目构造链接参数的时候,推送到app上的链接点了没办法跳转到对应的界面对比了一下能跳转的链接,原来是url没有加密,就推送过去了在这里把对url加密解密的方法记录一下,方便以后使用publicstaticStringgetURLEncoderString(Stringstr){Stringresult="";if(null==str){…

    2025年7月2日
    5
  • windows下用pycharm安装tensorflow简易教程

    windows下用pycharm安装tensorflow简易教程2019.4.14更新下面的内容挺老了,建议批判性阅读,各种版本一直在变化,最好的教程,果然还是tensorflow和pytorch的英文原网。Windows下面办公还行,不是很适合开发,也就跑跑小代码。我现在一般在windows上使用SSH连接远程linux的服务器,直接使用远程配置的解释器环境(pycharm有相应SSH功能,配置一下就好),这样可以方便的开着音乐,边看资料边coding…

    2022年6月18日
    47
  • SpringBoot重点详解–使用JPA操作数据库[通俗易懂]

    SpringBoot重点详解–使用JPA操作数据库[通俗易懂]目录JPA&SpringDataJPA配置Maven依赖配置数据源和JPA创建POJO实体数据持久化使用SpringDataJPA接口(方式一)CrudRepositoryPagingAndSortingRepositoryJpaRepositoryQueryByExampleExecutor自定义查询方法(方式二)JUnit测试…

    2022年6月22日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号