首页 新闻 会员 周边 捐助

整数最后一位取反,有没有简洁的好办法?

0
悬赏园豆:20 [已解决问题] 解决于 2012-12-07 22:58
((pred >> 1)<<1)|((pred & 0x1)?0x0:0x1)

上面是我现在用的代码,很觉得别扭。

走在溪边的主页 走在溪边 | 初学一级 | 园豆:89
提问于:2012-12-07 10:52
< >
分享
最佳答案
1

~x & 1

首先对所有位取反~x, 结果再&1只剩下最后一位取反的值。

收获园豆:20
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-12-07 10:59

是否有点不对啊? 

走在溪边 | 园豆:89 (初学一级) | 2012-12-07 12:11

 明白了,这样可以简化为((x>>1)<<1)|(~x & 1), 前面部分可以用x&0xfffffffe替换,只是0xfffffffe有点让人不舒服,而且碰到长整数就不对了. 有没有更简单的?

走在溪边 | 园豆:89 (初学一级) | 2012-12-07 12:20

@走在溪边: 哪里不对?你说的“整数最后一位取反”,是什么意思?比如这个整数是15,那么你要求的是对5取反,还是对15这个数的2进制(也就是1111)的最后一位取反?

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-12-07 12:21

@水牛刀刀: 不好意思,我没说清楚,我的本意是把一个整数的最后一位取反,其他位保持不变。

走在溪边 | 园豆:89 (初学一级) | 2012-12-07 13:19

@走在溪边: (x & ~1) + (~x & 1)

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-12-07 13:41

@水牛刀刀: 很漂亮的式子, 谢谢了.

走在溪边 | 园豆:89 (初学一级) | 2012-12-07 22:56

x ^ 1 竟然这样就可以了, 晕. 

xor 有以下性质: x^0 = x , x^~0 = ~x

走在溪边 | 园豆:89 (初学一级) | 2012-12-09 11:26

@走在溪边: 仔细想了下,确实是这样的。我知道xor操作符,但是没意识到可以这样妙用!

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-12-09 11:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册