&&是逻辑与 —— ||是逻辑或 —— &是按位与 —— |是按位或 —— ^是按位异或 —— <<是按位左移 —— >>是按位右移 —— ~是按位取反

本文详细解析了位运算(包括按位与、按位或、按位异或、按位取反、左移和右移)及逻辑运算(如逻辑与、逻辑或)的基本概念与实际应用,通过具体实例帮助读者理解这些运算符的功能及其在编程中的作用。

&&是逻辑与                                

“与”就是“并且”的意思,比如现在有一个数字a,

a < 1 && a > 0

就是表示a在0和1之间;

表达式1表达式2逻辑与结果
TrueTrueTrue
TrueFalseFalse
FalseTrueFalse
FalseFalseFalse

"逻辑与"关注的是符号两边数的真值。有0为0(C语言中可以这样看:0是False,0以外的值都为True)

||是逻辑或     

a > 1 || a < 0

就表示a比一大,或者a比零更小。

表达式1表达式2逻辑与结果
TrueTrueTrue
TrueFalseTrue
FalseTrueTrue
FalseFalseFalse

"逻辑或"关注的是符号两边数的真值。同0为0(C语言中可以这样看:0是False,0以外的值都为True)



&是位与    |是位或

   &        按位与

   |          按位或

   ^         按位异或

   <<      按位左移

   >>      按位右移

   ~        按位取反

1. 按位与(AND):&

      一定要将&与&&区分开来,后者是逻辑与。

(1)按位与的定义是:同一二进制位上的数字都是1的话,&的结果为1,否则为0.

0 & 0 = 0;

0 & 1 = 0;

1 & 1 = 1;

(2)根据这个特性,&操作常常用来屏蔽特定的二进制位。例如:

             0000 1111 & 0000 0011

             结果为0000 0011       可以看见,1111的前两位被屏蔽成为0了。

       所以如果想清空数据,只需要将原二进制数与上0就可以了。0的位数对应原二进制数的位数,对各位进行屏蔽,全部置0.

       相对的,&可以利用0来屏蔽,也可以用1来读取。

             例如: 一个二进制数 1101 1001,我只想要它的后四位,怎么办呢?

             只需要进行如下操作:1101 1001 & 0000 1111即可。

             其实该方法是屏蔽和读取的结合,&0保证消除无用位,&1保证有用数据的完整性。

            总结:对于原二进制数来说,&0是屏蔽,&1是不变。

2.按位或(OR):|

            同样,不要将“|”和“||”(逻辑或)搞混。

(1)定义:只要参与运算的双方其中有一个是1,结果就是1.同0才为0.

            0 | 0 = 0;

            0 | 1 = 1;

            1 | 0 = 1;

            1 | 1 = 1;

(2)特殊用处:

            将某些特定位置1.

            例如:1010 0000 | 0000 1111.

            结果为 1010 1111.

            总结:对于原二进制数来说,|0是不变,|1是置1.

3.按位异或:^

           ^这个符号我们常用来表示次方。不过在计算机中,它代表的就不是次方的意思了。

(1)定义

           只要参与运算的双方互异,结果就为1,否则为0.

           0 ^ 1 = 1;

           1 ^ 0 = 1;

           1 ^ 1 = 0;

           0 ^ 0 = 0;

(2).用法

           可以通过上面的定义看到,一个数^1的话就会0变成1,1变成0,而^0则不对原数进行改变。所以根据此特性可以对特定位进行0 1 反转。

          例如: 1100 1100 ^ 0000 1100

          结果为 1100  0000.

          同样的,如果对一个数进行^0,代表保留原值。

         总结:对于原二进制数来说,^0是不变,^1是反转。

4. 取反(~)

         对一个二进制数进行取反。1变0,0变1.

         唯一需要注意的一点是,~的优先级是逻辑运算符中最高的,必须优先计算。

5. 左移,右移

         左移与右移比较类似,是将目标二进制数字向左/右移动相应的位数。

         左移补0:1111 1111 << 1 == 1111 1110,换算十进制的话是原来数值的2倍。

         右移看情况:负数补1,正数补0.需要看符号位。同样,换算为十进制数值变为原来的1/2.

         总结:左乘右除。


 

### 电源电路工作原理分析 该电路是一个基于MOSFET和电感的DC-DC降压(Buck)转换器,其输入为+20V,输出目标为+5V,并通过MCU的PWM信号进行控制。其核心原理是利用电感储能和MOSFET开关控制,将高电压转换为低电压,同时通过电容滤波以获得稳定的输出电压。 #### 输入输出路径 输入电压+20V经过二极管D1后进入电感L1,再通过MOSFET的漏极连接至负载Rload,最终通过电容Cout滤波后输出稳定的5V电压。其中,D1通常为续流二极管,用于在MOSFET关断时为电感L1提供回路,防止反向电压损坏MOSFET,这一功能在感性负载中尤为重要[^2]。 #### MOSFETPWM控制 MOSFET作为开关器件,其栅极连接至MCU的PWM输出引脚。MCU通过调节PWM信号的占空比控制MOSFET的导通关断时间,从而控制输出电压的大小。具体而言,当MOSFET导通时,输入电压+20V通过L1向负载供电并储能;当MOSFET关断时,L1通过D1释放能量继续供电,使输出电压保持稳定。 该结构属于非隔离型Buck电路,其输出电压由下式近似决定: ``` Vout &asymp; Vin &times; Duty Cycle ``` 其中,Vin为输入电压,Duty Cycle为PWM占空比。例如,若占空比为25%,则理论上输出电压为5V(20V &times; 0.25 = 5V)。 #### 电感L1的作用 电感L1在Buck电路中起储能和续流作用。在MOSFET导通期间,电感吸收能量并存储于磁场中;在MOSFET关断期间,电感释放能量,维持负载电流连续,从而实现平滑的输出电压波形。电感值的选择影响输出电压的稳定性响应速度。 #### 输出电容Cout的作用 电容Cout用于滤除输出电压中的高频纹波,提高电压稳定性。较大的电容值可有效降低输出电压纹波,但会增加响应时间。因此,需根据负载变化速率稳定性要求选择合适的电容容量和类型。 #### 负载Rload的作用 Rload代表实际的用电设备,如LED、电机传感器等。其阻值影响电路的输出电流功率。Buck电路需根据负载功率调整MOSFET的导通能力散热设计,以确保系统稳定运行。 ### 示例代码:MCU PWM控制逻辑(标准库实现) 以下代码展示了如何使用STM32标准库配置PWM信号以控制MOSFET导通: ```c #include &quot;stm32f10x.h&quot; void PWM_Init(void) { // 使能GPIO和定时器时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 配置PA0为复用推挽输出(PWM输出) GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &amp;GPIO_InitStruct); // 配置TIM2定时器 TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_TimeBaseStruct.TIM_Period = 999; // 自动重载值(周期) TIM_TimeBaseStruct.TIM_Prescaler = 71; // 预分频值(72MHz/72 = 1MHz) TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM2, &amp;TIM_TimeBaseStruct); // 配置PWM通道 TIM_OCInitTypeDef TIM_OCStruct; TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OCStruct.TIM_Pulse = 250; // 占空比25%(250/1000) TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &amp;TIM_OCStruct); TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); // 启动定时器 TIM_Cmd(TIM2, ENABLE); TIM_CtrlPWMOutputs(TIM2, ENABLE); } int main(void) { PWM_Init(); while (1) { // 主循环可添加其他控制逻辑 } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值