位操作符
主要用于对二进制数的操作,三个是双目操作符,一个是单目操作符
& 按位与, 两个二进制数对比,同位为1才为1,其他都为0
| 按位或 两个二进制数比,同位有1就是1,其他都是0
^ 按位异或 两个二进制数比,同位相同为0,相异为1
~ (单目操作符)按位取反 对一个二进制数,1的位取0,0的位取1
比较常用的:
假定a是一个二进制数,则有:
a^0=a
a^a=0
正数的原码,反码,补码都是一样的。
负数的最高位是符号位,为1,原码取反得到反码,反码+1就是补码。补码转化为原码也是取反+1。
数字存在内存里都是用补码的方式,但打印时,打印出来是原码。其中需要在计算中转化。
左移右移操作符
<< 左移操作符 也用于对二进制数的操作,对二进制数往左移一位,往右边补0。正数左移一位后可能变成负数,负数亦然。
>> 右移操作符 用于二进制数的操作,对二进制数往右移一位,往左边最高位补符号数,正数补0,负数补1。其他位补0
结构体
数据类型有内置类型和自定义类型。内置类型有int /short/long/long long /float /double /char等,自定义类型学过的有数组。结构体也和数组一样属于自定义类型。
对结构体变量的声明:
struct kid
{
char name[10 ];
int age[10];
char sex;
};
对结构体变量的初始化:
struct kid p1={"zhangsan",5,1};
直接访问结构体成员:
结构体变量 . 成员名
printf("%c %d %c",p1.name,p1.age,p1.sex);
间接访问结构体成员:
struct num
{
int x;
int y;
};
int main()
{
struct num p1={1,2};
struct num *n=&p1;
n->x=9;
n->y=10;
printf("%d %d",n->x,n->y);
return 0;
}
此时打印出来的x和y都被赋值了新的9和10.
结构体嵌套初始化:
struct kids
{
struct kid;
int data;
}p2{{"lisi",7,0},2};