把一个字节按位翻转

很久没有玩过C语言的位操作了,今天重温了一下,并做了一道之前自己跟同事聊过的一道题,就是把一个字节按位翻转,举例来说,就是有二进制数(10010011),翻转之后就变为(11001001).
这一道题还是挺容易的,相信学过C语言的人都可以解决出来,简单地说,做一个循环就可以了,但如果想要取得更高的效率,就有很多考究了.
我们先不要看一个字节的情况,因为一个字节实在是太长了点…我们来看看只有两个二进制位的情况下,是怎么样的.
假设有二制数a = 01B,翻转后则为10B,同样的,如果原来是10B,翻转后则为01B.我们再试一下,可以发现如果原来为11B或者00B,翻转后则不变.这时我们可以写出两位二进制数的翻转算法如下:
if( a == 01B || a == 10B )
a ^= 11B;
else
a = a;
大家知道,给某二进制数的某一位异或(^)一个1,可将其取反,所以上面的a ^= 11B实际将a按位取反了,也即是从01B变为10B,或者从10B变为01B,这样我们可以看到他们实现了翻转.
推而广之,翻转一个字节,其实就是把第0位与第7位互换,把第1位与第6位互换等等.那么,上面的式子是否可以推而广之呢?事实上是可以的.
设有a = 10001100B;
执行a ^= 10000001B;
这时,a的二进制数为00001101B,第0位与第7位互换了!推广下去,a ^= 01000010B则是互换第1位和第6位,a ^= 00100100B是第2和第5位等等…….
那,我们实现了这个问题的解法了吗?没有!因为我们刚才没有考虑到当第0位和第7位相等,第1位和第6位相等等等的情况!在两个对应位相等的情况下,根据上面的翻转算法,我们不应该执行异或运算,因此,我们现在的任务就是分辩出对应位是否相等.
大家有没有什么好方法可以分辨出两个位是否相等?
再回头来看给我们很多启示的只有两个位的二进制数a,假设a = 11B,那么,这个
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值