[C/C++]操作硬件的位运算

15 篇文章 5 订阅

  • 🎈个人主页:北·海
  •  🎐CSDN新晋作者
  •  🎉欢迎 👍点赞✍评论⭐收藏
  • ✨收录专栏:C/C++
  • 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗

 

  • 问题 :
    • 把地址为0x80040的寄存器的最低4位设置为0110
  • 解决方案
    • 使用位运算
  • 什么是位?
    • 内存的基本单元是字节,一个字节有八位
  • 位与 &
    • 0 & 0        0
    • 0 & 1        0
    • 1 & 0        0
    • 1 & 1        1
  • 对应位,都是1,结果才是1
  • 00001000
  • 00000011
  • 00000000  -> 0
  • cout<<"8 & 3"<<(8 & 3)<<endl;
  • 结果为0

  • 位或 |
    • 0     |    1     1
    • 0     |    0     0
    • 1     |    0     1
    • 1     |     1    1
    • 对应位都是0 则为0
    • 8 | 3的计算
    • 00001000
    • 00000011
    • 00001011  -> 11
  • 位非 ~
  • ~1    0
  • ~0    1
  • 取反
  • 给8进行位非操作
  • 00001000
  • 11110111
  • usigned char x = ~8;
  • cout<<(int)x<<endl;
  • 输出结果为 247

  • 异或 ^
    • 0 ^ 0     0
    • 1 ^ 1     0
    • 0 ^ 1     1
    • 1 ^ 0      1
    • 两位相同为0,不相同为1
    •   8 ^ 3 进行异或操作
    • 00001000
    • 00000011
    • 00001011
    • cout<<(8 ^ 3)<<endl;
    • 输出结果为 11
  •  <<左移
    • 右边的位用0来填充,移动超出左边边界的位则直接抛弃,向左移动n个位置,就等同于乘以2的n次方
    • 只适应于:int short long char 等定点数类型(float,double,浮点数类型不能使用)
    • cout<<(8<<3)<<endl;
    • 输出结果位8*2*2*2 = 64
    • 00001000
    • 01000000
  • >>右移
    • 如果左操作数是无符号类型,则左边多出来的位用0来填充
    • 如果左边操作数是有符号类型,则左边多出来的位用符号位(最高位)来填充
    • 向左移动n个位置,就等同于除以2的n次
    • 只适应于int long char short 等定点数类型(float/double浮点数类型不能使用)
    • 00001000
    • 00000001
    • cout<<(8>>3)<<endl;
    • 输出结果位 1
    • 应用 :把一个整数的最低4位设置为0110
      • //将数字8(00001000)的二级制后四位设置为0110
        
        //第一步先将数字把的后四位清零,与数字00001000进行位|运算
        int x = 65;
        x = x & ~15;//15  00001111   ~15  11110000
        
        x = x | 6;
        cout<<x<<endl;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北·海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值