文章转载自:http://www.pythonheidong.com/blog/article/2537/
1 //
2 // main.m 3 // LessonScale 4 // 6 // Copyright (c) 2015年 Ashen. All rights reserved. 7 // 8
9 #import <Foundation/Foundation.h>
10 //当程序编译时,只会编译.m文件,不会编译.h文件 11 //#import 比 #include ,要略胜一筹,等通过#import多次导入头文件时,只会将内容拷贝一次
12 #import "Header.h" //导入意味着,将文件中得内容全部拷贝 13
14
15 //#define 宏名 要替换的内容 16 //宏的作用,只做替换,所有使用N的地方,都替换成20
17 #define N 20 //无参数宏
18
19 #define MUL(A,B) ((A) * (B)) //带参数的宏
20
21 //#define kMaxValue(A, B) A > B ? A : B//比较两个数的最大值
22 #define kMaxValue1(A, B) ({typeof(A) __a = A; typeof(B) __b = B; __a > __b ? __a : __b;})
23 /*
24 宏的注意事项: 25 1.宏名一般都是大写, 并且参数名大写 26 2.参数要加括号。 27 3.宏替换的内容不能有分号; 28 4.宏名和参数之间不能出现空格。 29 */
30
31 int main(int argc, const char * argv[]) { 32
33
34
35 ///////////////////C语言补充课程 进制,位运算符 上课笔记 ///////
36
37 //一、进制 38 //************************* 39
40
41 // 9 十进制 , 09 八进制, 0x9 十六进制, 0b9 二进制 42 // %d %o %0x 二进制输不出来 43
44 //栈区的内存分配原则:从高到底分配,从低到高存取。 45 //地址:内存单元的编号。 46 // int a = -5; //计算机中存取数据,是去数据的补码;负数的补码:绝对值取反加1 47 // int b = 20; 48 // printf("%p\n%p", &a, &b); 49
50 // int a[5] = {10, 20 ,30, 40, 50}; //20个字节, 第一个元素的地址最低(从低到高存取原则) 51 // //数组名,代码数组的首地址,同时也是数组中第一个元素的地址,数组名是一个常量地址,因此不能赋值,既不能参与运算。 52 // printf("%p\n%p", a, a + 1); 53
54
55 //二、位运算符 56 //************************* 57 // ,将数转变成二进制数之后的每一位进行运算 58 // //1.按位与 & , 作用清 0 操作 59 // int a = 5 & 7; // 5 0101, 60 // //&7 0111, 同为 1 则为 1 ,否则为 0 61 // //=5 0101 62 // printf("a = %d\n", a); 63 // //2.按位或 |, 64 // int b = 5 | 7; 65 // // 5 0101, 66 // //|7 0111, 同为 0 则为 0 ,否则为 1 67 // //=7 0111 68 // printf("b = %d\n", b); 69 //
70 // //2.按位异或 ^, 71 // int c = 5 ^ 7; 72 // // 5 0101, 73 // //^7 0111, 相同为 0 , 不同为 1 74 // //=2 0010 75 // printf("c = %d\n", c); 76 //
77 // //2.按位取反 ~ 78 // char d = ~5; 79 // // 5 0000 0101 80 // //~ 1111 1010 负数, 求补码, 取反加1, 81 // // 1000 0101 + 1 82 // // 1000 0110 83 // // -6 84 // printf("d = %d\n", d); 85 //
86 // //2.左移运算符, 将二进制数左移, 每左移一位相当于 * 2 87 // char e = 1 << 1; //1 0000 0001 88 // // 0000 0010 89 // printf("e = %d\n", e); 90 //
91 // //2.右移运算符, 将二进制数右移, 每右移一位相当于 / 2 92 // char f = 16 >> 3; //16 0001 0000 93 // //2 0000 0010 94 // printf("f = %d\n", f); 95 //
96 // //三、无符号和有符号的区别 97 // //有符号的数,将会把最高位拿出来作为符号位,用来计数的位数就少了一位。 0000 0000 最大 127 98 // //无符号的数,则所有的位数,都可以用来计数 0000 0000 最大 255 99 // //unsigned char 无符号, char 有符号; 默认是有符号 100 //
101 // /*不同数据类型取值范围 102 // 有符号: 103 // char: -2^7 ~ 2^7 - 1. 104 // short: -2^15 ~ 2^15 - 1. 105 // int: -2^31 ~ 2^31 - 1. 106 // 无符号: 107 // unsigned char: 0 ~ 2^8 - 1; 108 // unsigned short 0 ~ 2^16 - 1; 109 // unsigned int : 0 ~ 2^32 - 1; 110 // */ 111 //
112 // //交换两个变量 113 // int aa = 10, bb = 20; 114 //
115 // //Method one: 利用异或 116 // aa = aa ^ bb;//aa与bb的不同点存到aa中。 117 // bb = aa ^ bb;//aa代入aa,的aa,存入bb中 118 // aa = aa ^ bb; 119 //
120 // // //Method two: 121 // // aa = aa + bb; 122 // // bb = aa - bb; 123 // // aa = aa - bb; 124 //
125 // // //Method Three第三方变量temp略 126 // printf("%d\n ", aa); 127 //
128 //
129 //
130 //三、面试题: 131 //************************* 132 //
133 // //1. 高四位和低四位互换 134 // unsigned char a1 = 0b10010011; 135 // //把低四位移动到左边。左移 4 位 136 // unsigned char left1 = a1 << 4; 137 // unsigned char right1 = a1 >> 4; 138 // a1 = left1 | right1; 139 // printf("%d\n", a1); 140 //
141 //
142 // //2. 奇偶互换 143 // unsigned char a2 = 0b10010011; //10010011 >>> 0110 0011 144 // //奇数位移动到偶数位 145 // unsigned char left2 = a2 << 1; 146 // //保留偶数位, 将奇数位清0 ,