1.进制转换
1).10进制转为N进制.方法:(连除倒取余).
2).N进制转换为10进制.方法:(按权求和法):当前位上的数乘以基数的位数减1次方.
例:
0b1111 ---- 1* 2^3 + 1*2^2 +1 * 2^1 +1*2^0 = 15;
038 ----- 3*16^1 +8*16^0 = 56;
3).N进制转换N进制.
例如: 二进制 --- 16进制
1010 0011 ---- A 3
1111 0011 ---- F 3
int a = 010;//8进制
int b = 0x10;//16进制
printf("%d\n", a);
printf("%d\n", b);
/**
如何输出进制数:
%d ------ 十进制
%0x ------ 十六进制
%o ---- 八进制
*/
2.位运算符
//按位与 &
int a = 5 & 7;//5 101 7 111 同为1,则为1.否则为0 .,常用来给某一位做清零操作.
printf("%d\n", a);//101
//按位或 |
int b = 5 | 7;// 101 111 同为0,则为0,否则为1.,,常用来保留某一位状态.
printf("%d\n", b);//111
//按位异或 ^
int c = 5 ^ 7;
printf("%d\n",c);//101 111 010 ,相同为0,不同为1
//按位非 ~
char d = ~ 7;//每一位都做取反操作.
printf("%d\n", d); //7 111 -1000 -8
//负数补码运算: 绝对值取反 加1 符号位 1 相当于 - 0 相当于 +
//如果是一个有符号的数,则二进制最高位代表符号位,1 代表负数,0代表正数.
//数据在内存中存储时是以补码的形式存储,正数的补码是正数本身,负数的补码是绝对值取反加一.
//一个字节代表八位二进制数.
/**
* 数据类型的取值范围:
* 无符号:
* char 0 ~ 2^8 - 1 //0 - 255
* short 0 ~ 2^16 -1
* int 0 ~ 2^32 - 1
* 有符号:
* char 11111111有符号,最高位是符号位, - 2^7 ~2^7 - 1 -128 - 127(正数包括0,即128)
* short - 2^15 ~ 2^15 - 1
* int - 2^31 ~ 2^31 - 1
*/
char f = 255;//11111111 绝对值01111111 取反 100000000 加1 100000001 即 -1,负数是按照补码存储的
printf("%d\n", f);//-1
unsigned char e = 255;
printf("%d\n",e);//超出范围溢出,即为0
//左移 <<
unsigned char g = 1;
printf("%d\n",g << 3);//乘以2的3次方 // 8
//右移 >>
printf("%d\n",255 >> 2);//除于2的2次方 //63
例题
:
1.将100高四位与第四位互换.100: 0110 0100
unsigned char number = 0b01100100;
//1.左移动四位
unsigned char left = number << 4;//01000000
//2.右移动四位
unsigned char right = number >> 4;//00000110
//3.按位或
unsigned char result = left | right;//01000110
printf("%d\n", result);//70
2.将10010010 奇偶位互换
unsigned char num = 0b10010010;//146
//1.向左移动一位,得到奇数位
unsigned char left1 = num << 1; //00100100 ,因为是char型,当向左移动,值=146*2溢出.但换位int型就ok了.char类型范围,-128 - 127 printf("左移:num = %d,left1 = %d\n", num, left1);
//2.保留偶数为,将奇数位清零. 00100000
unsigned char l = left1 & 0b10101010;//奇数位清0,即奇数位为0.&同为1即为1
//3.向右移动一位得到
unsigned char right1 = num >> 1;//01001001
//printf("右移:num = %d,right1 = %d\n", num, right1);
//4.保留奇数位,讲偶数位清零. 01000001
unsigned char r = right1 & 0b01010101;
//5.按位或
unsigned char s = r | l;
printf("%d\n", s);
2.两个数交换,不使用第三个变量(企业级做法)
int m = 10, n = 5;
m = m ^ n;
n = m ^ n;
m = m ^ n;
printf("%d %d\n", m, n);
4.栈内存分配原则
<span style="color:#000000;">/**
* 栈区内存分配原则
* 原则: 从高到低分配,从低到高存取.
* 地址: 内存单元的一个编号
*/
//数组名代表数组的首地址,也就是数组中第一个元素的地址.是一个常量地址.
int m1[5] = {1, 2, 3, 4, 5};
printf("%p\n", m1); //0x7fff5fbff7f0结果
printf("%p\n", &m1[0]);//0x7fff5fbff7f0
printf("%p\n", &m1[1]);//0x7fff5fbff7f4
printf("%p\n", &m1[2]);//0x7fff5fbff7f8
printf("%p\n", &m1[3]);//0x7fff5fbff7fc
printf("%p\n", &m1[4]);//0x7fff5fbff800 //存取,从高到低存取
printf("-------------------------\n");
int x = 5;
int y = 10;
printf("%p\n",&x);//0x7fff5fbff7b8
printf("%p\n",&y);//0x7fff5fbff7b4,可看出从高到底分配空间
int s1 = - 5;// 1000 0000 0000 0000 0000 0000 0000 0101 按照补码存储,绝对值取反加一
printf("%d\n", s1);//1111 1111 1111 1111 1111 1111 1111 1011 FF FF FF FB //断点
</span>