- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
位的经典操作(数据结构)
位的经典操作
检测一个无符号数是不为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)+(xy)
x-y = x + ~y + 1 = (x~y)-(~xy)
x^y = (x|y)-(xy)
x|y = (x~y)+y
xy = (~x|y)-~x
x==y: ~(x-y|y-x)
x!=y: x-y|y-x
x y: (x-y)^((x^y)((x-y)^x))
x=y: (x|~y)((x^y)|~(y-x))
x y: (~xy)|((~x|y)(x-y)) //无符号x,y比较
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, x0; 0, x == 0 ; 1, x 0
int sign(int x)
{
return (x31) | (unsigned(-x))31 ;//x=-2^31时失败(^为幂)
}
三值比较:cmp(x,y) = -1, x y
int cmp( int x, int y )
{
return (xy)-(x-y) ;
}
doz=x-y, x=y; 0, xy/y int doz(int x, int y )
{
int d ;
d = x-y ;
return d ((~(d^((x^y)(d^x))))31) ;
}
int max(int x, int y )
{
int m ;
m = (x-y)31 ;
return y m | x ~m ;
}
不使用第三方交换 x,y:
1. x ^= y ; y ^= x ; x ^= y ;
2. x = x+y ; y = x-y ; x = x-y ;
3. x = x-y ; y = y+x ; x = y-x ;
4. x = y-x ; x = y-x ; x = x+y ;
双值交换:x = a, x==b; b, x==a//常规编码为x = x==a ? b :a ;
1. x = a+b-x ;
2. x = a^b^x ;
下舍入到2的k次方的倍数:
1. x ((-1) 2.(((unsigned)x)k)k/k 上舍入:
1. t = (1 2.t = (-1)k x=(x-t-1)amp;amp;t/k
位计数,统计1位的数量:
1.
int pop(unsigned x)
{
x = x-((x1)0 ;
x = (x0 + ((x2) 0) ;
x = (x+(x4)) 0xst1:chmetcnv w:st=on tcsc=0
unitname=F sourcevalue=0 numbertype=1 negative=False hasspace=False0f/st1:chmetcnvst1:chmetcnv w:st=on tcsc=0 unitname=F sourcevalue=0 numbertype=1 negative=False hasspace=False0f/st1:chmetcnvst1:chmetcnv w:st=on tcsc=0 unitname=F sourcevalue=0 numbertype=1 negative=False hasspace=False0f/st1:chmetcnvst1:chmetcnv w:st=on tcsc=0 unitname=F sourcevalue=0 numbertype=1 negative=False hasspace=False0f/st1:chmetcnv ;
x = x + (x8) ;
x = x + (x16) ;
return x 0xst1:chmetcnv w:st=on tcsc=0 unitname=F sourcevalue=3 numbertype=1 negative=False hasspace=False0000003f/st1:chmetcnv ;
}
2.
int pop(unsigned x) {
static char table[256] = {
文档评论(0)