移位操作的妙用

int countLeadingZeros(int x) { int count = 0; if(x == 0) return 32; if((x & 0xFFFF0000) == 0) { count += 16; x <<= 16; } if((x & 0xFF000000) == 0) { count += 8; x <<= 8; } if((x & 0xF0000000) == 0) { count += 4; x <<= 4; } if((x & 0xC0000000) == 0) { count += 2; x <<= 2; } if((x & 0x80000000) == 0) { count += 1; } return count; } int reverse(int x) { int y = 0x55555555; x = (((x >> 1) & y) | ((x & y) << 1)); y = 0x33333333; x = (((x >> 2) & y) | ((x & y) << 2)); y = 0x0f0f0f0f; x = (((x >> 4) & y) | ((x & y) << 4)); y = 0x00ff00ff; x = (((x >> 8) & y) | ((x & y) << 8)); return ((x >> 16) | (x << 16)); } 

 

一个用于求一个整数二进制中前面0的个数,例如000110  为3

 

一个用于反转一个整数二进制位,例如000110-》011000

1、反转相邻的两个位:例如第一位与第二位反转,第三位与第四位反转  12345678-》21436587

2、连续两位进行反转:例如第一位、第二位和第三位、第四位反转  21436587-》 43218765

3、连续四位进行反转:43218765 -》 87654321

4、连续八位进行反转

5、连续16位进行反转

 

注意y的取值,很巧妙

 

 

 

 

你可能感兴趣的:(移位操作的妙用)