本次记录较为重要的位运算部分,这在之后的单片机学习中比较重要。
位运算:
位运算是指按二进制位进行的运算,因为在系统软件中经常要处理二进制位 的问题。
与或非的基本逻辑在离散数学以及c++语言学习中涉及较多,不多记录,注意具体的运用。
异或:相同为0,不同为1;
1,使特定位翻转。 在特定位与1进行^运算。
2,保留原值,与0进行^,可以保留原值。
3,交换两值,不用中间临时变量。
例如: a=3;b=4;
a=a^b;
b=a^b;
a=a^b;//这里的顺序不能乱。
左移:
左移运算符是用来将一个数的各个二进制位全部左移若干位。低位补0。高位溢出的舍弃。
右移:
右移运算符是用来将一个数的各个二进制位全部右移若干位。
对于无符号数,右移时高位补0;
有符号数,若符号位为0(正数)补0 , 若符号位是1(负数)移入的数字取决于计算机系统,有的补0 ,有的则补1。
移入0的称为逻辑右移,而移入1的称为算术右移,
位运算符与赋值运算符可以组成复合赋值运算符。
例如:&=,^=,|=,<<=,>>=。
a&=b 相当于 a= a&b;
题目:取一个char a从右端开始的2-5位:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a,b,c,d;
printf("请输入待验证的数组:");
scanf("%d",&a);
b = a>>2;
c = ~(~0<<4);
d = b&c;
printf("%d\n",d);
}
结果为:
循环移位:
直接用一道题目记录:
:将a进行右循环移位
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned char a,b,c;
int n;
printf("请输入要循环右移的数字:");
scanf("%d",&a);
printf("请输入要循环右移的位数:");
scanf("%d",&n);
b = a <<(sizeof (char)* 8-n);
c = a >> n;
c = c|b;
printf("结果是:%d\n",c);
}
结果为:
位段:
信息的存取一般用字节为单位,实际上有时候储存一个信息不必用一个或者多个字节,
例如:真假表示只需要1位,0或1 表示即可。
在计算机用于过程控制,参数检测或者数据通信领域 控制信息往往占据一个字节中的一位或者几位(二进制位),一个字节中往往有几个信息。
C语言中允许,一个结构体中以位为单位来指定其成员所占内存的长度,,这类成员称为位段或者 位域 。 利用位段可以用较少的位数来储存数据。
struct packed_data
{
unsigned a:2;unsigned b:6;
unsigned c:4;
unsigned d:4;
int l;
}data;
位域通常用于打包数据以满足特定的内存对齐要求或与硬件设备的通信协议。然而,位域的使用也受到一些限制,例如它们不能取地址,不能作为数组的元素,也不能是动态内存分配的对象。
位段成员必须是unsign或者int类型。
中间加unsigned :0;表示接下来的位段从另一个字开始存放。
C语言暂时记录到这里,之后有新的内容会继续补充。