位运算:
求反~:例如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);
} |