位运算练习1
/*
* 位运算符练习
* 需求:分别使用3种方式实现判断一个数是否为偶数
* 1. 使用三目运算符
* 2. 使用if/else语句
* 3. 使用位运算
*/
/* 如果使用位运算
* 举几个栗子
* 9
* 1001
*
* 7
* 0111
*
* 6
* 0110
*
* 4
* 0100
*
* 可以发现,奇数和偶数的区别就是
* 最后1位是0还是1
* 所以,可以让这个数与上1
* 结果为0是偶数
*/
int num = 6;
/*
* 这里需要先注意优先级问题
* 需要在num和1之间加括号
* 否则会先计算1 == 0
* 直接返回false
*/
if ((num & 1) == 0) {
printf("even");
}else{
printf("odd");
}
位运算练习2
/*
* 位运算符练习2
* 需求:使用至少3种方式,交换2个int类型变量的值
* 1. 使用临时盒子temp
* 2. 使用算数运算符
* 3.
*
* 这里说一下第2,3种方式
*/
// 第2种方式:利用算术运算符
int a = 10;
int b = 20;
a = a + b; // 先计算2个数的和
b = a - b; // 2个数的和减去b的值,剩下的就是a的值
a = a - b; // 2个数的和减去a(b目前是原来的a)的值,剩下的就是b的值
printf("%i,%i",a,b); // 20,10
// 第3种方式:位运算
/*
* 需要使用按位异或
* 2位相同为1,不同为0
*/
int c = 12; // 0000 0000 0000 1100
int d = 24; // 0000 0000 0001 1000
c = c ^ d; // c = 20
// 0000 0000 0001 0100
d = c ^ d; // d = 12
// 0000 0000 0000 1100
c = c ^ d; // c = 24
// 0000 0000 0001 1000
/*
* 我对这个程序的理解是
* 如果出于可读性考虑
* 一开始的c可以换成temp
*
* 先得到2个数不同位的索引(2数异或),得到的结果赋值为temp
* 假设2个数为m,n
* m ^ temp = n
* n ^ temp = m
* 在企业开发中,一般用第一种方式
*/
printf("%i,%i",c,d);
位运算练习3
变量内存分析
/*
* 变量内存分析
* 1. 内存是1个线性有序的模型
* 2. 内存地址是从大到小的
* 3. 由于内存地址是从大到小的,所以开辟存储空间的时候,
* 也会从大到小进行开辟
* 4. 变量的地址就是所占用内存空间最小的地址,如果连续定义2个
* int类型的变量,地址会从高到低相差4位
* 5. 内存分配会从高到低分配二进制位
*/
char类型的存储细节
/*
* char类型的存储细节
* 1. 由于计算机只能识别0和1,所以不能直接将字符直接存储到内存中
* 2. 为解决这一问题,美国制定1张ASCII表
* 3. 所以以后再存取字符的时候,本质都是存储这个字符对应的ASCII值
*/
类型说明符
长度类型说明符,用于扩容和缩容
说明符号位的类型说明符
/*
* 说明符号位的类型说明符
* signed 告诉操作系统可以存储负数,0和正数
* unsigned 告诉操作系统只能存储0和正数
*
* 默认情况下int类型的变量是有符号数
*/