java 位运算实例_java经典位运算实例

1) int型变量循环左移k次,即a=a <

(13)求从x位(高)到y位(低)间共有多少个1

public static int FindChessNum(int x, int y, ushort k)

{

int re = 0;

for (int i = y; i <= x; i++)

{

re += ((k >> (i - 1)) & 1);

}

return re;

}

(14)

/*将32位数分解为4个8位数处理后再合成32位数返回*/

DWORD GetDW(DWORD dw)

{

DWORD dwRet=0;

if (dw!=0)

{

BYTE b1=(dw>>24)&0xff,b2=(dw>>16)&0xff,b3=(dw>>8)&0xff,b4=dw&0xff;

//分别处理 b1,b2,b3,b4

dwRet=b1;

dwRet=(dwRet<<8)+b2;

dwRet=(dwRet<<8)+b3;

dwRet=(dwRet<<8)+b4;

return dwRet;

}

else{

return 0;

}

}

检测一个无符号数是不为2^n-1(^为幂):   x&(x+1)

将最右侧0位改为1位:   x   |   (x+1)

二进制补码运算公式:

-x   =   ~x   +   1   =   ~(x-1)

~x   =   -x-1

-(~x)   =   x+1

~(-x)   =   x-1

x+y   =   x   -   ~y   -   1   =   (x|y)+(x&y)

x-y   =   x   +   ~y   +   1   =   (x|~y)-(~x&y)

x^y   =   (x|y)-(x&y)

x|y   =   (x&~y)+y

x&y   =   (~x|y)-~x

x==y:         ~(x-y|y-x)

x!=y:         x-y|y-x

x

x<=y:         (x|~y)&((x^y)|~(y-x))

x

x<=y:         (~x|y)&((x^y)|~(y-x))//无符号x,y比较

使用位运算的无分支代码:

计算绝对值

int   abs(   int   x   )

{

int   y   ;

y   =   x   >>   31   ;

return   (x^y)-y   ;//or:   (x+y)^y

}

符号函数:sign(x)   =   -1,   x

CC++支持比较低阶的位运算,在是众人皆知的了。每本CC++的教科书都会说到这部分的内容,不过都很简略,我想会有很多人不知道位运算用在什么地方。这个帖子就简略说说位运算的用处,更进一步的用法要大家自己去体会。而主要说的是操作标志值方面。

/****************************************/

#define BTI_MSK(bit)    (1 <

#define BIT_SET(x,bit)  ((x) |=  BTI_MSK (bit))

#define BIT_CLR(x,bit)  ((x) &= ~BTI_MSK (bit))

#define BIT_TST(x,bit)  ((x) &   BTI_MSK (bit))

/****************************************/

考虑一个事物、一个系统、或者一个程序可能会出现一种或者几种状态。为了在不同的状态下,作出不同的行为,你可以设立一些标志值,再根据标志值来做判断。比如C++的文件流,你就可以设定一些标志值,ios::app, ios::ate, ios::binary, ios::in, ios::out, ios::trunc,并且可以将它用|组合起来创建一个恰当的文件流。你可能会将这些标志值定义为bool类型,不过这样要是设置的标志值一多,就会很浪费空间。

而假如定义一个整型数值,unsigned int flags; 在现在的系统,flags应该是32位, 用1,2,3....32将位进行编号,我们可以进行这样的判断, 当位1取1时,表示用读方式打开文件,当位2取1时,表示用写方式打开文件,当位3取1时,用二进制方式打开文件....因为flags有32位,就可以设置32个不同的状态值,也相当于32个bool类型。这样一方面省了空间, 另一方面也多了个好处,就是如前面所说的,可以将标志值组合起来。

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

好啦,上面有点不清不楚的。下面看看到底怎么操作这些标志值。

设想C++的类ios这样定义, 其实没有这个类,只有ios_basic类,typedef basic_ios

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值