位运算与预编译知识点总结

位运算

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值