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

 

安卓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校验结果,校准方式,手势识别等功能设置。

 

红糖馒头

简单,健康,安全,好吃。

红糖块或粉45g,耐高糖酵母3g,中筋面粉500g,水适量。

40度温水100g,加入红糖,搅拌融化到待30度左右,加入酵母。等10分钟。

取面粉放入容器内,用红糖水和面,糖水底部渣渣不要。

适当加水和面至盆光面光手光。

盖上湿纱布,放入烤箱调至发酵30分钟,旁边放个小水杯。

或者30度左右室温发酵。

发酵后面团约2倍大。

取出后排气,加面粉和面至不沾手。

揉成条状,再切成小块馒头。

蒸锅冷水加温到刚烫手,关火放入切好的馒头,饧面10分钟,发现又变大一圈。

开火蒸15分钟。关火,闷5分钟。

小盆友吃的馒头出锅了,配个紫菜蛋花汤。

丰年虾

丰年虾常被作为小鱼苗的开口饲料。其卵能长时间恶劣环境下保存生命力是最大的特点,能活在盐水浓度极高的卤水里面。

尝试了几回,终于把它养大:

绿水:用粗盐,加自来水调制5%浓度的盐水,这是重点,浓度太低养不活。这是虾用生命换来的真理。在太阳下暴晒1-2周。加点鱼缸里面的老水做种子,期间补水到标记的水线。之后水中出现绿色水藻。

孵化:取一点点丰年虾卵直接放入,24小时后应该就出现小虾。小虾会以绿藻为食物。虾的数量自己会控制,多了也会死。1周加点螺旋藻粉。展开覆盖一半水面就可以。

2-3周之后虾应该就成年了。母虾尾部有卵巢,公虾头部有比较大,有类似螯的触角。成体1cm左右。