C语言位操作-学习笔记

C语言的位操作最常用的地方就是用在对寄存器的写值上。

一 .基本概念

1.位与:&

操作:1 & 1 = 1;  1 & 0 = 0;  0 & 0 = 0;

全是1才1,有0则0.

任何数和0位与就是0,和1位与没有变化,所以位与常用在清零上。

2.位或:|

操作:1 | 1 = 1;  1 | 0 = 1;  0 | 0 = 0;

全0才0,有1则1.

任何数和1位或就是1,和0位或没有变化,所以位或常用在置位上。

3.位取反:~

操作:~1 = 0;  ~0 = 1;

4.位异或:^

操作:1 ^ 1 = 0;  1 ^ 0 = 1; 0 ^ 1 = 1; 0 ^ 0 = 0;

相同为0,不同为1.

任何数和1位异或会取反,和0异或没有变化,特定位要取反就用位异或。

5.左移(<<)和右移(>>)

操作的时候要考虑有符号数(signed number)和无符号数(unsigned number)。

对于有符号数:左移的时候右侧补0;右移的时候左侧补符号位(正数符号位为0,则补0;负数符号位为1,则补1).

对于无符号数:左移的时候右侧补0;右移的时候左侧也是补0.

注意:我们对寄存器进行赋值的时候用的都是无符号的数

二 .与逻辑运算的区别

1.逻辑运算的基本符号:逻辑与(&&)  逻辑或(||)  逻辑取反(!)

2.我们需要注意的地方就是:位操作中只有1和0;逻辑操作的中非0代表是真(1),0就代表是假(0)

3.运算的时候,位运算是把数字拆为一位一位的进行运算的;逻辑运算是把数字作为一个整体进行运算的,但是他们运算的基本操作和位运算一致(譬如:1 && 1 = 1, 0 && 1 = 0 等等)。

譬如:7 && 0 = 0    111 & 0 = 0

7 && 3 = 1    111 & 011 = 011

三.对寄存器写值的三部曲

1.首先,把寄存器中的值读出来

2.其次,修改寄存器中的值

3.最后,把修改好的值写进去

四.代码示例

1.给定一个整型数a,设置a的bit3,保证其他位不变:

unsigned int a = 0x97;    //设定a=10010111;
a |= (1<<3);                            // 对1左移3位=1000,在与a或运算后赋值给a=10011111;
printf(“a = 0x%x.\n”, a); //a = 0x9F.

2、给定一个整形数a,设置a的bit3~bit7,保持其他位不变

unsigned int a = 0x97;    //设定a=10010111;
a |= (0x1f<<3);                            // 对0x1f左移3位=11111000,在与a或运算后赋值给a=11111111;
printf(“a = 0x%x.\n”, a); //a = 0xFF.

3、给定一个整型数a,清除a的bit5,保证其他位不变

unsigned int a = 0x97;    //设定a=10010111;
a &= (1<<5);                            // 对1左移5位=10000,在与a与运算后赋值给a=10000111;
printf(“a = 0x%x.\n”, a); //a = 0x87.

4、给定一个整形数a,取出a的bit2~bit6

unsigned int a = 0x97;    //设定a=10010111;

a &= (0X1F<<2);           // 对0X1F左移2位=1111100,在与a与运算后赋值给a=00010100
a >>=2; //a右移2位,a=101
printf(“a = 0x%x.\n”, a); //a = 0x5.

5、宏定义参数

#define SET_BIT(x,n) (x | 1U<<(n-1))
//这里就是要把数字x的第n位(bit(n-1)位)置为1
//1U就表示的是无符号的1

#define CLEAR_BIT(x,n) (x & ~(1U<<(n-1)))
//这里就是要把数字x的第n位(bit(n-1)位)清零

#define SET_BITS(x,n,m) (x | ~(~0U<<(m-n+1))<<(n-1))
//这里就是要把数字x的第n到m位置为1(n是低位,m是高位)
//就是先把0取反就可以得到很多的1,然后左移就得到那么多个0,再取反就可以得到你想要的1的个数了
//最后左移位或就可以置1了

#define GET_BIT(x,n,m) (x & ~(~0U<<(m-n+1))<<(n-1)) >>(n-1)
//截取变量的部分连续位。(就是取出的意思)
//其实和上面那里是差不多的,后面那一大部分都是为了确定需要多少个1
//最后记得右移,为了得出那个数字

 

参考:https://www.cnblogs.com/nibuyaoni/p/5547795.html

 

糖醋排骨

糖醋排骨的做法步骤
1.小排500克焯水后,煮三十分钟,肉汤可以煮面条,别倒掉了。

2.用一汤匙料酒,一汤匙生抽,半汤匙老抽,二汤匙香醋(不是白醋)腌渍20分钟。

3.捞出洗净控水备用,炸制金黄,油别放多,可以省油,只要翻身的勤就好了。

4.锅内放排骨,腌排骨的水,三汤勺白糖(大胆的放糖吧,三汤匙,别怕多)。半碗肉汤大火烧开,调入半茶匙盐提味。

5.小火焖十分钟大火收汁,收汁的时候最后加一汤匙香醋,那个酸甜口就出来了。

6.临出锅撒葱花芝麻,少许味精。

温馨小提示
备注——窍门三个:

1,如何外酥里嫩——煮30分钟,这样再大火热油炸到外面焦黄,就外酥里嫩了。如果用生排骨直接炸,容易老
2,为啥要腌渍,因为热锅热油迅速封住了肉外表,做糖醋汁的时候不容易吸收进去,排骨里面有肉腥味
3,怎么炸排骨?——大火猛催,反正已经煮了三十分钟,早熟了,所以只要保证外面脆就可以了。

糖醋红烧肉

  • 五花肉焯水后洗净沥干水切块,姜切片,热油锅

  • 炒香姜片,下入五花肉炒,依次加入一汤勺料酒、两勺酱油、三勺白糖、四勺醋,混合翻炒一下

  • 再接着加入漠过五花肉的白开水,大火煮开改中小火焖煮,煮到料汁剩少许,改大火收汁,感觉肉汁有粘稠感时方可盛盘

安卓8.0/7.1.2里如何消除x号

在安卓8.0/7.1.2里如何消除x号(在老一点点版本是感叹号)呢?
1.首先开启usb调试,然后用数据线连接电脑和手机。
2.然后解决好您的adb驱动问题
3.在电脑开始菜单-运行 输入cmd,打开命令提示符
依次输入下面语句
(以下办法支持安卓8.0/7.1.2/7.1.1)
adb shell settings put global captive_portal_https_url https://www.google.cn/generate_204

然后开启飞行模式,然后关闭飞行模式。搞定!

迪文屏SD卡CONFIG文件定义终端模式配置

CONFIG定义

示例:

R2=2B

R3=BF

参数说明:

R0-屏幕物理分辨率设置(出厂以及配置完毕)

R4-显示位时钟相位选择(出厂以及配置完毕)

R1 R5 R9-串口波特率配置 当R1大于10 波特率由R5 R9决定 计算公式R5:R9=6250000/波特率   计算出结果后 R5为高字节,R9为低字节

R3 RA-串口通信帧头设置(出厂预设值为R3=5A RA=A5 所以帧头为0x5A A5)

R2 RC-软件寄存器配置 可将这两个视为两个寄存器配置(一共有8位0-7)配置使用按位配置定义

R2包括偏转显示,背光,串口CRC,DGUS周期等功能的设置。

RC包括运行DWIN OS,蜂鸣器提示音,每一页显示数量,应答CRC校验结果,校准方式,手势识别等功能设置。