向大牛学习!

在刷到LeetCode 190. reverse bits中,抱着学习的态度对Discuss的大牛代码进行学习,发现了使用很巧妙的位操作的答案,其代码如下,该代码为LeetCode 190 Discuss高赞代码,非原创。

uint32_t reverseBits(uint32_t n) {
n = (n >> 16) | (n << 16);
n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8);
n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4);
n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) << 2);
n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1);
return n;
}
其中,使用了0xaaaaaaaa,0x55555555等十分奇怪的字符,下面介绍对该部分字符进行介绍.

在C/C++中,0x为十六进制的前缀标识,0位八进制的前缀标识,十进制没有前缀标识。

因此,那些奇怪的字符为整数的十六进制表示。有那么多的整数,为何在涉及位操作程序中会出现这些整数呢。

因为这些整数的二进制形式很特殊,可以借助Windows系统自带的计算器,快捷计算出该整数的二进制形式

0xaaaaaaaa = 10101010101010101010101010101010 (偶数位为1,奇数位为0)

0x55555555 = 1010101010101010101010101010101 (偶数位为0,奇数位为1)

0x33333333 = 110011001100110011001100110011 (1和0每隔两位交替出现)

0xcccccccc = 11001100110011001100110011001100 (0和1每隔两位交替出现)

0x0f0f0f0f = 00001111000011110000111100001111 (1和0每隔四位交替出现)

0xf0f0f0f0 = 11110000111100001111000011110000 (0和1每隔四位交替出现)

利用上述具有特殊二进制的整数,可以很方便进行位操作,而且该整数的十六进制形式比较好记,也不用写那么多的0,1.
---------------------
作者:zhusf16
来源:CSDN
原文:https://blog.csdn.net/u012604810/article/details/80623241
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自www.cnblogs.com/IAmParasite/p/10125992.html