位运算:
求反~:例如char i = 5;~i = -6;对每位求反,前面的0也是要求反的。
按位与&:二进制数进行and操作,和全是1与是原数,和全是0与是0.
按位或|:二进制数进行or操作
按位异或^:两个数相同是0,不同是1.
注:如果IP地址和子网掩码按位与相同的话,说明是在一个网段的,不是一段网段就是需要路由的。子网掩码,如果是255.255.255.255有255个网段,每个网段只能有一台主机;255.255.255.254一共有126个网段,每个网段只能存在两台主机;但是0的话,可以有1个网段,每个有255个主机;网段128分为2个网段。1-127是一个网段,128-255是一个网段。255.0.0.0是A类地址,255.255.0.0 是B类地址,255.255.255.0 是C类地址。
位操作使用案例:掩码、打开位(指定位置设为1,让指定位置是0,其余是1的数和原数或操作)、关闭位(指定位置设为0,让指定位置是0,其余是1的数和原数与操作)。置换位(异或操作)、查看某一位的值(1001 0000 & 0001 0000查看第5位的值)
左位移<<:i<<2,左位移2位,后面补零。向左位移2位,就是i乘以2的2次幂。如果移位过多,会溢出。
右位移>>:如果是1000 0000 右移一位1100 0000.如果有符号位的话,有可能保留符号位,window是符号位填充的。右移是除以2的n次幂。
预编译指令:
可以定义宏函数,就是使用可参数的宏,没有类型,在比较两个数大小,或者绝对值的时候,使用函数宏比较常见。
#defineXNAME(n) x ## n 在变量较长的时候使用。 这样在定义的时候int XANME(1) = 10;预编译之后是 int x1 = 10;
可变参数,#define PR1(...)printf(__VA_ARGS__)替换printf,要想实现可变参数的函数,必须包含一个stdarg.h库文件,函数原型必须包含一个确定的参数,必须要定义一个va_list类型的变量,初始化为ap,然后使用vs_start(ap,a),使用完之后使用vs_end(ap)。使用第一个参数来标识共有多少个参数。
Int max(int a,...) { Va_list ap; Va_start(ap,a); Int i = va_arg(ap,int); Va_end(ap); } |
是使用宏还是使用参数,有些编译器限制宏只能定义一行,宏产生的是内联代码,不检查变量的类型。
#undef MAX 取消了宏MAX的定义,之后可以重新定义。
#if MAX == 200#elif #else #endif
预定义的宏:__DATE__系统预处理的时间 __LINE__当前行号
__FILE__代表当前的文件 __TIME__代表当前的编译时间
#linn 100 修改行号 #error custom error使编译器输出错误,就和scanf使用的时候输出的error4996一样。
#pragma 只是vs的设置
诊断库:assert.h 里面有一个assert(int i),只要条件不成立,就会终止程序的运行。
程序:
1.将IP地址和子网掩码按位与放在字符串s中
void IP(const char *IP, const char *mask, char *s) { int a1[4] = { 0 }; sscanf(IP, "%d.%d.%d.%d", &a1[0], &a1[1], &a1[2], &a1[3]); int a2[4] = { 0 }; sscanf(mask, "%d.%d.%d.%d", &a2[0], &a2[1], &a2[2], &a2[3]); sprintf(s, "%d.%d.%d.%d", a1[0] | a2[0], a1[1] | a2[1], a1[2] | a2[2], a1[3] | a2[3]); } |
2.自己实现的printf函数,只有使用getchar()
//数字的输出 void shu(int n) { if (n < 10) { putchar(n + 0x30); return; } else { shu(n / 10); putchar(n % 10 + 0x30); } } void Myprintf(const char *s, ...) { va_list ap; va_start(ap, s); while (*s) { if (*s == 'd') { int i = va_arg(ap, int); shu(i); } | else if (*s == 's') { char *buf = va_arg(ap, char*); while (*buf) { putchar(*buf); buf++; } }
else if (*s == '%') { s++; continue; } else { putchar(*s); } s++; } va_end(ap); } |