【学习ios之路:C语言】进制.位运算.栈
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>
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。