一段更换IP地址网络编号的C语言宏

来源:互联网 发布:iis7 php 页面空白 编辑:程序博客网 时间:2024/05/29 11:21

对于下列宏进行分析:

#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17

#define bmMCDR2_ADDRESSBIT_MASK(MCDR2_ADDRESS)

#define BIT_MASK(_bf)((1U<<(bw##_bf))-1)<<(bs##_bf) 

#define SET_BITS(_dst, _bf, _val)\

         (_dst)= (((_dst)&~(BIT_MASK(_bf))) |(((_val)<<(bs##_bf))&(BIT_MASK(_bf))))

// 使用形式:SET_BITS(MCDR2,MCDR2_ADDRESS, RegisterNumber)

 

宏BIT_MASK:形成bwMCDR2_ADDRESS个1位及bsMCDR2_ADDRESS个0位的二进位串,即(bwMCDR2_ADDRESS+ bsMCDR2_ADDRESS)位地址的高bwMCDR2_ADDRESS为1的掩码。在此例中,bmMCDR2_ADDRESS = 1  1110  0000 0000  0000  0000。

工作原理:

(1U<<(bw##_bf))-1:将1左移bwMCDR2_ADDRESS位,并-1,当为4时,即(B1  0000 – 1) = 1111。

((1U<<(bw##_bf))-1)<<(bs##_bf):左移bsMCDR2_ADDRESS位,补0,即1  1110 0000  0000  0000  0000。

 

宏SET_BITS:将_dst地址的低bsMCDR2_ADDRESS(此例为17)与_val组成新地址。

若_dst=1  0010  1001  1100  0101  0011,_val = 0011,则_dst将形成新的地址:

0      0110  1001  1100  0101  0011。

工作原理:

(_dst)&~(BIT_MASK(_bf)):将掩码取反,与_dst相与,即取低bsMCDR2_ADDRESS位。

(_val)<<(bs##_bf)):将_val左移bsMCDR2_ADDRESS位,_val对应高bwMCDR2_ADDRESS位。

((_dst)&~(BIT_MASK(_bf))) |(((_val)<<(bs##_bf))&(BITMASK(_bf))):即将上两值或运算,取_val低bsMCDR2_ADDRESS位,取_val高bwMCDR2_ADDRESS位。

 

作用:SET_BITS可用于更新(bwMCDR2_ADDRESS+ bsMCDR2_ADDRESS)位IP地址的网络编号。

 


源码如下所示:

#include "stdio.h"
#include <stdlib.h>
#include "conio.h"


#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)


#define BIT_MASK(_bf) ((1U<<(bw##_bf))-1)<<(bs##_bf) 


#define SET_BITS(_dst, _bf, _val)\
(_dst)= ( ((_dst)&~(BIT_MASK(_bf))) | (((_val)<<(bs##_bf)) & (BIT_MASK(_bf))) )


/*使用形式:SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber)*/


void main()
{
unsigned dst =  0x1ffff; /* 1 1111 1111 1111 1111*/
unsigned regnum = 0x8; /* 1000 */
printf("%x\n", BIT_MASK(MCDR2_ADDRESS)); /*0x1e0000, 即: 1 1110 0000 0000 0000 0000*/ 
SET_BITS(dst, MCDR2_ADDRESS, regnum); 
printf("%x\n", dst);/*11ffff,即: 1 0001 1111 1111 1111 1111*/
}