如何对某一位置0或者置1?

本文介绍了C语言中常用的位操作技巧,包括如何使用按位或运算来置1,使用按位与运算来清0,并展示了实际应用案例,如嵌入式系统中的寄存器设置。
方法一:
写成宏,方便移植
#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  

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/hongjiujing/archive/2008/03/13/2178593.aspx

置1就让对应的寄存器和对应的位是1的值按位做或运算。
如 state |=0x0010;   //第5位置1
置0就让对应的寄存器和对应的位是0的值按位做与运算。
如state &=~(0x0010);   //第5位清0

if( flag == 1 )
        //OUTPUT_BIT( PIN_D5 , 1 );//OUTPUT_D( 0X20 );
        {
            ValveState |= 0X20 ;
            OUTPUT_D( ValveState );
        }
    else if( flag == 0 )
        //OUTPUT_BIT( PIN_D5 , 0 );//OUTPUT_D( 0X00 );//关闭进样阀,关条码,关马达
        {
            ValveState &= ~(0X20) ;
            OUTPUT_D( ValveState );
        }


 

置1就让对应的寄存器和对应的位是1的值按位做或运算。
如 state |=0x0010;   //第5位置1
置0就让对应的寄存器和对应的位是0的值按位做与运算。
如state &=~(0x0010);   //第5位清0

if( flag == 1 )
        //OUTPUT_BIT( PIN_D5 , 1 );//OUTPUT_D( 0X20 );
        {
            ValveState |= 0X20 ;
            OUTPUT_D( ValveState );
        }
    else if( flag == 0 )
        //OUTPUT_BIT( PIN_D5 , 0 );//OUTPUT_D( 0X00 );//关闭进样阀,关条码,关马达
        {
            ValveState &= ~(0X20) ;
            OUTPUT_D( ValveState );
        }


最后一个方法有效

 

在C语言中,对某位进行**清00)**、**1位)**、或者**取反**等操作是嵌入式开发或底层编程中常见的需求。这类操作通常通过**位运算符**来实现。 --- ### 1. 常用位运算符 | 运算符 | 含义 | |--------|------------| | `&` | 按位与 | | `|` | 按位或 | | `~` | 按位取反 | | `^` | 按位异或 | | `<<` | 左移 | | `>>` | 右移 | --- ### 2. 对某位的操作 假设我们有一个变量 `reg`,我们要对其第 `n` 位(从右往左数,最低位为第0位)进行操作。 #### ✅ 清0(将第n位置0) ```c reg &= ~(1 << n); ``` - `1 << n`:生成一个只有第n位为1的掩码。 - `~(1 << n)`:将该掩码取反,得到除第n位外全为1的掩码。 - `&=`:将reg与该掩码按位与,使第n位为0,其余位不变。 #### ✅ 1(将第n位置1) ```c reg |= (1 << n); ``` - `1 << n`:生成一个只有第n位为1的掩码。 - `|=`:将reg与该掩码按位或,使第n位为1,其余位不变。 #### ✅ 取反(翻转第n位) ```c reg ^= (1 << n); ``` - `^=`:异或操作会翻转指定的位。 #### ✅ 判断某位是否为1 ```c if (reg & (1 << n)) { // 第n位为1 } else { // 第n位为0 } ``` --- ### 示例代码: ```c #include <stdio.h> int main() { unsigned char reg = 0b10101010; // 初始值 // 清0:将第3位清0 reg &= ~(1 << 3); printf("After clear bit 3: %02X\n", reg); // 1:将第1位置1 reg |= (1 << 1); printf("After set bit 1: %02X\n", reg); // 取反:翻转第5位 reg ^= (1 << 5); printf("After toggle bit 5: %02X\n", reg); // 检查第7位是否为1 if (reg & (1 << 7)) { printf("Bit 7 is 1\n"); } else { printf("Bit 7 is 0\n"); } return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值