简单理解位运算:位与&、位或|、位非~、异或^、左移<<、右移>>

位运算,顾名思义,就是对字节中的每个位进行一位一位的运算。

常见的运算符有:位与(&)、位或(|)、位非(~)、异或(^)、左移(<<)、右移(>>)。

基本规则:

1.位与运算(&):有0为0,双1为1

a10101110
b11001010
a & b10001010

2.位或运算(|):有1为1,双0为0

a10101110
b11001010
a | b11101110

3.位非运算(~):也叫按位取反运算,1变0,0变1

a10101110
~a01010001

4.异或运算(^):相同为0,不同为1

a10101110
b11001010
a ^ b01100100

5.左移(<<):所有位依次向左移动,右边补0

100000001
1 << 200000100

6.右移(>>):所有位依次向右移动,左边补0

12810000000
128 >> 500000100

位运算在嵌入式编程中的应用

对数值进行位运算有很多实际应用,比如:

左移(5<<3)就相当于5乘2的3次方,也就是:5*(2^3)=40

右移(8>>2)就相当于8除2的2次方,也就是:8/(2^2)=2

还有很多巧妙的用法,不过单纯对数值进行位运算,可读性不强,用适当的代码或函数也能完成同样的操作。

最常见的应用是在嵌入式编程中,对字节的某个位或几个位进行控制。

注意:

1.在进行位操作时,我们其实根本不用关心这个变量的数值到底是多少,只关注我们希望的某个位或者某几个位到底是0还是1。

2.在位操作中,一般不要直接用(=)赋值(除非赋初值),因为这样赋值会把所有的位全都改变了,而我们实际上只想改变某些位,对其他的位并不想改变。所以应该用(&=、|=、^=)来赋值,只改变需要改变的位,其他位不变。

(&=):因为任何数&0为0,一般用来把某些位清零

(|=):因为任何数|1为1,一般用来把某些位设为1

(^=):用来翻转某个位,1^1=0,也就是把1翻转为0;0^1=1,也就是把0翻转为1

以下是几个常见的位运算的例子:

uint16_t a = 0x1234; //注意这是16进制数,每个数字占4个位

a &= 0xFF0F; //把第4-7位清零,其他位不变

a |= 0x0070;//16进制7是二进制0111,把4-7位设置成0111,其他位不变

a |= 1<<2;//(1<<2)是二进制100,也就是把第2位设为1,其他位不变

a ^= 0x0004;//16进制4是二进制100,也就是单独翻转a的第2位,其他位都不变

a = ~0x0000;//对每一位全部取反,现在a的每个位都变成1了,也就是0xFFFF

以上是个人理解,说的不对的地方见谅,请多批评指正。

&lt;think&gt;好的,我现在需要为用户介绍编程中的几个基本运算符:自增与自减运算、三目运算以及位运算。首先,我得回忆这些概念的具体内容,确保自己理解正确,然后组织成清晰的中文解释。 首先,自增和自减运算。我记得这两个运算符分别是++和--,用来对变量进行加1减1操作。但要注意它们的前置和后置的区别,比如i++和++i的不同效果。前置是先运算后返回值,后置则相反。可能需要用例子来说明,比如a = 5时,b = a++和b = ++a的结果差异。 接下来是三目运算,也就是条件运算符。语法是条件 ? 表达式1 : 表达式2。当条件为真时返回表达式1,否则返回表达式2。这个运算符可以简化if-else语句,例如比较两个数的大小,返回较大的值。需要举一个具体的例子,比如max = (a &gt; b) ? a : b。 然后是位运算,这部分可能稍微复杂一些。包括与、、非、异或左移右移。这些运算符直接操作二进制。对于每个运算符,我需要解释它们的规则,并给出例子。比如与运算(&amp;)只有在两都为1时才为1,运算(|)则至少一为1。非运算(~)是取反,异或^)是相同为0不同为1。左移右移运算符则涉及到的移动,左移相当于乘以2的n次方,右移分逻辑右移和算术右移,可能要根据语言的不同说明,但通常右移保留符号。 在组织内容时,要分点讲解,每个部分用小标题,使用中文,避免使用Markdown格式。同时,确保行内公式用$...$,独立公式用$$...$$。例如,位运算的例子可能需要用二进制数字,比如5的二进制是0101,3是0011,然后进行按位与操作,得到0001,即1。这样的例子能帮助用户更直观地理解。 需要检查是否有遗漏的运算符者错误的理解。例如,自减运算同样分前置和后置,和三目运算的优先级问题,位运算中的移位运算是否包括无符号右移等。不过,用户的问题中没有提到无符号右移,可能不需要深入,但可以提到右移时高补符号的情况。 最后,确保每个部分结构清晰,逐步解释,用例子辅助说明,让用户能够一步步理解。同时注意LaTeX语法的正确性,比如位运算的例子中的数字要用$...$包裹,确保格式正确。&lt;/think&gt;(4)变量自增与自减运算 自增(`++`)和自减(`--`)是单目运算符,用于对变量进行加1减1操作,分为前置和后置两种形式: - **前置形式**:先改变变量值,再使用新值 例: ```c int a = 5; int b = ++a; // a先变为6,再将6赋值给b ``` 此时 $a=6$,$b=6$ - **后置形式**:先使用原值,再改变变量值 ```c int a = 5; int b = a++; // 先将5赋值给b,a再变为6 ``` 此时 $a=6$,$b=5$ --- (5)三目运算 三目运算符 `条件 ? 表达式1 : 表达式2` 根据条件选择执行表达式: - 若条件为真,返回表达式1的值 - 若条件为假,返回表达式2的值 例: ```c int a = 10, b = 20; int max = (a &gt; b) ? a : b; // 结果为20 ``` 等价于: ```c if (a &gt; b) max = a; else max = b; ``` --- (6)位运算 位运算直接操作二进制,适用于整数类型: 1. **与(`&amp;`)**:两均为1时结果为1 ```c 5 &amp; 3 = 1 // 二进制:0101 &amp; 0011 = 0001 ``` 2. **(`|`)**:至少一为1时结果为1 ```c 5 | 3 = 7 // 0101 | 0011 = 0111 ``` 3. **非(`~`)**:按取反(0变1,1变0) ```c ~5 = -6 // 二进制:~0000...0101 = 1111...1010(补码) ``` 4. **异或(`^`)**:两不同时结果为1 ```c 5 ^ 3 = 6 // 0101 ^ 0011 = 0110 ``` 5. **左移(`&lt;&lt;`)**:高丢弃,低补0 ```c 5 &lt;&lt; 2 = 20 // 0101 &rarr; 10100(相当于 $5 \times 2^2 = 20$) ``` 6. **右移(`&gt;&gt;`)**:低丢弃,高补符号(算术右移) ```c -8 &gt;&gt; 2 = -2 // 二进制:1111...1000 &rarr; 1111...1110 ``` --- **总结** - 自增/自减用于快速修改变量值,注意前置与后置的区别 - 三目运算简化条件判断逻辑 - 位运算直接操作内存中的二进制,常用于底层开发优化算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

胡十三刀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值