1.0除3乘3c语言为1,C语言基础一(位运算)

1、程序结构

一、C语言顺序结构

程序是按照从上到下的顺序依次执行的。web

二、选择结构

选择结构,程序中会判断并选择一条符合条件的语句执行。bash

if + else

if(条件表达式)

执行的语句:

else if(条件表达式)

执行的语句;

else

执行的语句;

switch case

switch(表达式) //不能为小数,由于计算机中的小数只能存储近似值。

{

case 常量:

执行的语句;

break;

.

.

.

default:

执行的语句;

break;

}

break;是跳出这个选择结构,如果没有break,就继续按顺序结构执行下面的语句。svg

三、循环结构

for、while、do while。工具

一、for

for(初始条件(赋值表达式); 条件表达式(终止条件); 步长(循环增量))

循环体;

多条语句必须加花括号。

执行顺序:初, 条, 体, 步。spa

二、while

while(条件表达式)

循环体;

执行顺序:先判断条表,再执行循环体。code

do while

do{

循环体;

}while(条件表达式)

执行顺序: 先执行循环体,在判断条件表达式。xml

2、位运算

&,|,^,~。

<>。内存

一、按位与&

真值表:

1 & 1 = 1

0 & 1 = 0

1 & 0 = 0

0 & 0 = 0

注意:位与是&,&&是逻辑与。it

二、按位或|

真值表:

1 | 1 = 1

0 | 1 = 1

1 | 0 = 1

0 | 0 = 0

注意:位或是 |,|| 是逻辑或。class

三、按位异或^

真值表:

1 ^ 1 = 0

0 ^ 1 = 1

0 ^ 0 = 0

1 ^ 0 = 1

相同的值异或为0,不一样的值异或为1。

四、按位取反~

将操做数按照二进制位按位取反(1变成0,0变成1)

注意:按位取反是~,逻辑取反是!

(0或者1) & 0 = 0, (0或者1) & 1 = 其自己;

(0或者1) | 0 = 其自己, (0或者1) | 1 = 1;

(0或者1) ^ 0 = 其自己, (0或者1) ^ 1 = (1或者0,至关于取反);

五、左移位<>

C语言的移位要取决于数据类型,与数据在内存中的存储形式有关。

对于无符号数:

左移<

右移>>时,左侧补0(至关于逻辑移位)

仅对于无符号数操做,左移动N位,是乘以2的N次方;右移N位,是除以2的N次方

对于有符号数:

左移<

右移>>时,左侧补符号位(算术移位,若是正数就补0,负数就补1)

嵌入式中研究、使用的移位都是无符号数。

3、位运算的应用

按位与,按位或,按位异或在操做寄存器时的特殊做用

一、寄存器操做的要求(特定位改变而不影响其余位)

(1)ARM是内存与IO统一编址的,ARM中有不少内部外设,SoC中CPU经过向这些内部外设的寄存器写入一些特定的值来操控这个内部外设,进而操控硬件动做。因此能够说:读写寄存器就是操控硬件。

(2)寄存器的特色是按位进行规划和使用。可是寄存器的读写倒是总体32位一块儿进行的(也就是说你只想修改bit5~bit7是不行的,必须总体32bit所有写入)

(3)寄存器操做要求就是:在设定特定位时不能影响其余位。

(4)如何作到?答案是:读-改-写三部曲。读改写的操做理念,就是:当我想改变一个寄存器中某些特定位时,我不会直接去给他写,我会先读出寄存器总体原来的值,而后在这个基础上修改我想要修改的特定位,再将修改后的值总体写入寄存器。这样达到的效果是:在不影响其余位原来值的状况下,我关心的位的值已经被修改了。

二、特定位清零用&

(任何数,其实就是1或者0)与1按位与时无变化,与0按位与时变成0。

假设原来32位寄存器中的值为:0xAA AA AA AA,要将bit8~bit15清零,能够将这个数与0xFF FF 00 FF按位与,

结果为0xAA AA 00 AA。

三、特定位 置1用|

(任何数,其实就是1或者0)与1按位或变成1,与0按位或无变化。

假设原来32位寄存器中的值为:0xAA A0 00 0A,要将bit8~bit15置1,能够将这个数与0x00 00 FF 00按位或。

结果为0xAA A0 FF 0A。

四、特定位取反用^

(任何数,其实就是1或者0)与1位异或会取反,与0位异或无变化。

假设原来32位寄存器中的值为:0xAA AA AA AA,要将bit16~bit23置1,能够将这个数与0x00 FF 00 00按位异或。

结果为0xAA 55 AA AA。

五、用位运算构建特定二进制数

寄存器位操做常常须要特定位给特定值

解法1:直接给出完整的32位特定数。

优点:能够完成工做,难度也不大,操做起来也不是太麻烦。

劣势:依赖工具,并且不直观,读程序的人不容易理解。

评价:凑活能用,可是很差用,应该被更好用的方法替代。

解法2:本身写代码用位操做符号(主要是移位和位取反)来构建这个特定的二进制数

使用移位获取特定位为1,其余位为0的二进制数

如咱们须要一个bit3~bit7为1(隐含意思就是其余位所有为0)的二进制数,能够这样:(0x1f << 3)

获取bit3~bit7为1,同时bit23~bit25为1,其他位为0的数:((0x1f << 3) | (7 << 23))

结合位取反获取特定位为0,其余位为0的二进制数

由于移位时是补0的,因此

要获取bit4~bit10为0,其他位所有为1的数,用左移加按位取反的方式来构造比较简单。

首先将构造特定位为1,其余位为0的数,再取反。

若是想要改变的特定位不止一处,那么能够多段分别构造,而后再按位或,这时候的按位或至关于几个数相加。

由于参与位或运算的各个数为1的位是不重复的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值