查看: 2339|回复: 1

C语言中常见的置位操作

[复制链接]
  • TA的每日心情
    擦汗
    2024-5-31 10:44
  • 签到天数: 1492 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2014-1-6 12:44:16 | 显示全部楼层 |阅读模式
    分享到:
    如何对某一位置0或者置1?
    方法一:

    写成宏,方便移植
    #define setbit(x,y) x|=(1<<y) //将X的第Y位置1
    #define clrbit(x,y) x&=~(1<<y) //将X的第Y位清0




    方法二:

    C语言位运算除了可以提高运算效率外,在嵌入式系统的编程中,它的另一个最典型的应用,而且十分广泛地正在被使用着的是位间的与(&)、或(|)、非(~)操作,这跟嵌入式系统的编程特点有很大关系。我们通常要对硬件寄存器进行位设置



    譬如,我们通过将AM186ER型80186处理器的中断屏蔽控制寄存器的

    第低6位设置为0(开中断2),最通用的做法是:

    #define INT_I2_MASK 0x0040
    wTemp = inword(INT_MASK);
    outword(INT_MASK, wTemp &~INT_I2_MASK);


    而将该位设置为1的做法是:

    #define INT_I2_MASK 0x0040
    wTemp = inword(INT_MASK);
    outword(INT_MASK, wTemp | INT_I2_MASK);


    判断该位是否为1的做法是:

    #define INT_I2_MASK 0x0040
    wTemp = inword(INT_MASK);
    if(wTemp & INT_I2_MASK)
    {
    … /* 该位为1 */
    }


    方法三:

    int a|=(1<<x) //X就是某位需要置1的数字,如第四位置1为: a|=(1<<4)
    int b&=~(1<<x) //把某位置0

    x=x|0x0100    //把第三位置1
    x=x&0x1011    //把第三位置0

    #define BitGet(Number,pos) ((Number) >> (pos)&1)) //用宏得到某数的某位
    #define BitGet(Number,pos) ((Number) |= 1<<(pos)) //把某位置1
    #define BitGet(Number,pos) ((Number) &= ~(1<<(pos)) //把某位置0
    #define BitGet(Number,pos) ((Number) ^= 1<<(pos)) //把Number的POS位取反

    典型操作有:
    WTCON |=  (1 << 5) //WTCON的第五位清1
    WTCON &= ~(1 << 5) //WTCON的第五位清0  


    上述方法在嵌入式系统的编程中是非常常见的,我们需要牢固掌握。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2015-11-27 12:35
  • 签到天数: 113 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2014-1-8 18:38:56 | 显示全部楼层
    支持楼主
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-15 12:11 , Processed in 0.116338 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.