matlab mck传递函数,我的C实践(4):基本操作的位运算实现

下面使用位运算来实现一些基本的操作和基本的函数,这些实现全部都是宏,这是高效率的关键。

/* base.h:基本操作的位运算实现 */

#ifndef BASE_H

#define BASE_H

#define word int

#define uword unsigned int

/* 将最右侧的1位改成0位 */

#define right1to0(x) ((x)&((x)-1))

/* 向右传播最右侧的1位 */

#define right1torig(x) ((x)|((x)-1))

/* 将最右侧的连续1位串改成0位串 */

#define right1sto0s(x) (((x)|(x)-1)+1 & (x))

/* 检查无符号整数x是否为2的幂,注意&的优先级低于==,需要括号 */

#define powof2u(x) (((x)&((x)-1))==0)

/* 检查无符号整数x是否为2**n-1的形式 */

#define pow2sub1u(x) (((x)&((x)+1))==0)

/* 检查无符号整数x是否为2**j-2**k形式 */

#define pow2subpow2u(x) ((((x)|(x)-1)+1 & (x))==0)

/* 下列掩码直接析出字中指定的位 */

/* 析出最右侧的1位 */

#define right1(x) ((x) & -(x))

/* 析出最右侧的0位 */

#define right0(x) (~(x)&((x)+1))

/* 析出后缀0 */

#define suffix0(x) (((x)&-(x))-1)

/* 析出最右侧的1位和后缀0(即后缀10...0) */

#define suffix10s0(x) ((x) ^ (x)-1)

/* 下列掩码与字做&运算,可以析出字中指定的字段 */

/* 析出高阶n位(注意n的值不能大于int型的宽度) */

#define high_ones(n) (-1<<32-(n))

/* 析出低阶n位 */

#define low_ones(n) (~(-1<

/* 析出低阶offset位和高阶32-offset-width位 */

#define mid_zeros(width,offset) /

(-1<

/* 析出中间width位,它右侧有offset位 */

#define mid_ones(width,offset) /

(~(-1<

/* 对无符号整数x,求比x大且与x中的位1个数相同的下一个整数:

例如对nnn0 1111 0000,则下一个整数为nnn1 0000 01111。

可以用这个函数来遍历一个集合的所有子集 */

#define nextsame1u(x) (right1(x)+(x) | /

(((x)^right1(x)+(x))>>2)/right1(x))

/* 字的绝对值函数:注意x>>31为0或-1,而x^0=x,x^-1=~x */

#define abs(x) (((x)^((x)>>31))-((x)>>31))

/* 绝对值的负值 */

#define nabs(x) (((x)>>31)-((x)^((x)>>31)))

/* 符号扩展:将第7位向左传播(位编号从0开始) */

#define prop7thtolef(x) ((((x) & 0x000000FF) ^ 0x00000080)-0x00000080)

/* 对无符号整数实现算术右移:也可用更简单的((signed)(x)>>n) */

#define arithrshiftu(x,n) ((((x)^0x80000000)>>(n))-(0x80000000>>(n)))

/* 对有符号整数实现逻辑右移:也可用更简单的((unsigned)(x)>>n) */

#define logicrshift(x,n) ((((x)^0x80000000)>>(n))+(1<<31-(n)))

/* 符号函数:x>0返回1,x=0返回0,x<0返回-1 */

#define sign(x) (((x)>0)-((x)<0))

/* 三值比较函数:x>y返回1,x=y返回0,x

#define cmp(x,y) (((x)>(y))-((x)

/* 符号传递函数:返回采用y的符号后的x */

#define copysign(x,y) ((abs(x)^((y)>>31))-((y)>>31))

/* 比较谓词:带符号整数 */

#define equal(x,y) (~((x)-(y)|(y)-(x))>>31)

#define noteq(x,y) (((x)-(y)|(y)-(x))>>31)

#define less(x,y) ((((x)^(y)) & ((x)-(y)^(x)) ^ (x)-(y))>>31)

#define larger(x,y) ((((y)^(x)) & ((y)-(x)^(y)) ^ (y)-(x))>>31)

#define lesseq(x,y) ((((x)|~(y)) & ((x)^(y) | ~((y)-(x))))>>31)

#define largereq(x,y) ((((y)|~(x)) & ((y)^(x) | ~((x)-(y))))>>31)

/* 比较谓词:无符号整数 */

#define equalu(x,y) (~((x)-(y)|(y)-(x))>>31)

#define notequ(x,y) (((x)-(y)|(y)-(x))>>31)

#define lessu(x,y) ((~(x) & (y) | ~((x)^(y)) & (x)-(y))>>31)

#define largeru(x,y) ((~(y) & (x) | ~((y)^(x)) & (y)-(x))>>31)

#define lessequ(x,y) (((~(x)|(y)) & (((x)^(y)) | ~((y)-(x))))>>31)

#define largerequ(x,y) (((~(y)|(x)) & (((y)^(x)) | ~((x)-(y))))>>31)

/* 溢出检测:带符号运算 */

#define addovf(x,y) ((~((x)^(y))&(((x)+(y))^(x)))>>31)

#define subovf(x,y) ((((x)^(y))&(((x)-(y))^(x)))>>31)

#define mulovf(x,y) ((y)<0 && (x)==0x80000000 || (y)!=0 && (x)*(y)/(y)!=(x))

#define divovf(x,y) ((y)==0 || (x)==0x80000000 && (y)==-1)

/* 溢出检测:无符号运算 */

#define addovfu(x,y) (~(x)

#define subovfu(x,y) ((x)

#define mulovfu(x,y) ((y)!=0 && (x) > 0xffffffff/(y))

#define divovfu(x,y) ((y)==0)

/* 循环移位:带符号整数 */

/* 循环左移n位 */

#define rotlshift(x,n) ((x)<>32-(n))

/* 循环右移n位 */

#define rotrshift(x,n) ((unsigned)(x)>>(n) | (x)<<32-(n))

/* 循环移位:无符号整数 */

#define rotlshiftu(x,n) ((x)<>32-(n))

#define rotrshiftu(x,n) ((x)>>(n) | (x)<<32-(n))

/* 正差函数:x>=y时返回x-y,x

#define doz(x,y) ((x)-(y)&~((x)-(y)^((x)^(y))&((x)-(y)^(x)))>>31)

/* 大值函数 */

#define max(x,y) ((y)+doz(x,y))

/* 小值函数 */

#define min(x,y) ((x)-doz(x,y))

/* 下面是无符号版本 */

#define dozu(x,y) ((x)-(y)& arithrshiftu(((x)|~(y))&((x)^(y)|~((x)-(y))) ,31))

#define maxu(x,y) ((y)+dozu(x,y))

#define minu(x,y) ((x)-dozu(x,y))

/* 交换变量的值 */

#define swap(x,y) /

do { x=x^y; y=y^x; x=x^y; } while(0)

/* 根据掩码来交换变量的相应字段:

当m的第i位为1时,交换x,y的第i位;当m的第i位为0时,保留x,y的第i位不变 */

#define swapbits(x,y,m) /

do { x=x^y; y=y^(x&(m)); x=x^y; } while(0)

/* 2个常量的循环赋值:当x为a时赋值b,当x为b时赋值a */

#define rottwo(x,a,b) do{ x=(a)^(b)^x; }while(0)

/* 3个常量的循环赋值 */

#define rotthree(x,a,b,c) /

do{ x=(-(x==c)&(a-c))+(-(x==a)&(b-c))+c; }while(0)

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值