C语言某一个位置1、清0

二进制位操作:置1与清0的运算符理解

一、前提

了解 |(或)、&(与)、<<(左移)、>>(右移)、~(取反)这个几个运算符的用法和概念。

|(或)运算符:有“1”为“1”

&(与)运算符:有“0”为“0”,全“1”为“1”

<<(左移)运算符:左移就是把一个数的所有位都向左移动若干位

>>(右移)运算符:右移就是把一个数的所有位都向右移动若干位

~(取反)运算符:通俗点讲就是“1”变成“0”,“0”变成“1”

 二、某一位置"1"

例子:char a=1, 他的二进制数就是0000 0010 把这个数的第二位置“1”,这个第二位是从右往左数且最右边为第零位,即0000 0010红色位置“1”

    代码表示:  a |= 1<<2;

解析:1<<2  二进制表示 0000 0100  ,左移一位后的二进制数0000 0100

这个0000 0100再和0000 0010相或;即0000 0100 | 0000 0010 = 0000 0110

结果0000 0110这样就完成置“1”.

三、某一位清"0"

此例以上述a=6为例,把第二位清“0”,二进制表示 0000 0110

    代码表示: a&= ~(1<<2);

解析: 1<<2二进制表示  0000 0100  ,左移一位后的二进制数0000 0100

0000 0100 取反得到 1111 1011

1111 1011再和0000 0110相与;即0000 0110&1111 1011 = 0000 0010

结果0000 0010这样就完成清“0”.

在C语言中,对某一位进行**0(置0)**、**置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、付费专栏及课程。

余额充值