进制、位运算及结构体
参考教程:
二进制转换成十六进制
进制固定格式:二进制0B、十六进制0X、十进制直接写数字
例:二进制0B1111、十六进制0XOF、十进制15
进制的转换:
二进制转换十六进制:
一位十六进制数等于4位二进制数,可以通过8421码来计算,从左至右四位一组,不够分配左边补0
进制转化也可通过计算器来完成:
结构体
结构体是把多个不同类型的数据集合在一个类型之中。
C语言中的集合数据类型:结构体和数组。
结构体的定义:
方法一:先定义结构类型,后说明结构变量
struct 结构名
{
成员列表
};
方法二:在定义结构类型的同时说明结构变量
struct 结构名
{
成员列表
} 结构变量;
如:
结构体的使用:
-
定义结构体
-
写入数据
-
数据调用
前缀typedef:
typedef 是一种关键字,可以使用它来为类型取一个新的名字,typedef关键字的书写规则:
1、用类型定义变量名;
2、在定义变量名之前加上typedef关键字。如:
typedef unsigned char BYTE; // 在这个类型定义之后,标识符 BYTE 可作为类型 unsigned char 的缩写,例如: BYTE b1, b2;
可参考:C typedef
结构体中加入关键字typedef:
位运算
-
定义:位运算就是直接对整数在内存中的二进制位进行操作。由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。
-
概述:
可参考: -
无符号右移(>>>)
无符号右移则始终补0,不考虑正负数。 -
异或运算性质:
1、交换律
2、结合律 (a ^ b) ^ c == a ^ (b ^ c)
3、对于任何数x,都有 x ^ x=0,x ^ 0 = x
4、自反性: a ^ b ^ b=a ^ 0 = a; -
左移和右移
左移,相当于乘以2;右移,相当于除以2- 左移:各二进位全部左移若干位,高位丢弃,低位补0
125 << 3 左移: 0 1 1 1 1 1 0 1 --------------- 0|1 1 1 1 1 0 1 0 << 1 0 1|1 1 1 1 0 1 0 0 << 2 0 1 1|1 1 1 0 1 0 0 0 << 3 ^ ^ ^ 补0 结果: 125<<3 = 1110 1000 = -24(八位) 125<<3 = 1110 1000 = 1000(十六位) 相当:125*2的3次方(若左移时舍弃的高位不包含1)
- 右移:各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
用Dev-C++运行后结果为:125 >> 3 右移: 0 1 1 1 1 1 0 1 --------------- 0 0 1 1 1 1 1 0 |1 >> 1 0 0 0 1 1 1 1 1 |0 1 >> 2 0 0 0 0 1 1 1 1 |1 0 1 >> 3 ^ ^ ^ 正数补0负数补1 结果: 125>>3 = 0000 1111 = 15 等价与 125/2的3次方的商
- 左移:各二进位全部左移若干位,高位丢弃,低位补0
-
位运算用途
- 与运算:
1)清零
如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
2)取一个数的指定位
比如取数 X=1010 1110 的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位与运算(X&Y=0000 1110)即可得到X的指定位。
3)判断奇偶
只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a & 1) == 0)代替if (a % 2 = = 0)来判断a是不是偶数。 - 或运算
常用来对一个数据的某些位设置为1
比如将数 X=1010 1110 的低4位设置为1,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位或运算(X|Y=1010 1111)即可得到。 - 异或运算
1)翻转指定位
比如将数 X=1010 1110 的低4位进行翻转,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行异或运算(X^Y=1010 0001)即可得到。
2)与0相异或值不变
例如:1010 1110 ^ 0000 0000 = 1010 1110
3)交换两个数
如:
运行结果如下:void Swap(int &a, int &b){ if (a != b){ a ^= b; // 相当于a=a^b b ^= a; a ^= b; } }
- 取反运算
使一个数的最低位为零
使a的最低位为0,可以表示为:a & 1。1的值为 1111 1111 1111 1110,再按"与"运算,最低位一定为0。因为" ~"运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。
- 与运算: