@LIUHUAN
2019-12-31T22:41:41.000000Z
字数 1339
阅读 736
algorithm
n=11111111111111111111111111111101
,翻转后的结果为:n=10111111111111111111111111111111
n%10,n/10
这种方式。
uint32_t reverseBits(uint32_t n) {
if (n == 0)
return n;
const int N = 32;
uint32_t r = 0,i,j=0;
while(n) {
i = n&1; // 获取最后一位数字,0,1 类似n%2
r <<= 1; // 左移扩大
r |= i;// 类似十进制的 r += i
j++;
n>>=1;// 右移,除以2,倒数第二位变成倒数第一位
}
return r << (N-j);// 剩下的位数左移
}
uint32_t reverseBits(uint32_t n) {
n = (n >> 16) | (n << 16); // 交换低16位和高16位
n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8);// 交换低8位和高8位
n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4);// 交换低4位和高4位
n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) << 2);// 交换低2位和高2位
n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1);// 交换低1位和高1位
return n;
}
int reverse(int n){
while(n) {
x = n %10;
n/=10;
}
}
int reverse(int x) {
if(x == INT_MIN) // 最小值特殊case
return 0;
int a = abs(x);
int z = 0;
while(a) {
if(overflow(z)) // 溢出判断
return 0;
z *=10;
z += a%10;
a /=10;
}
return x >0 ? z:-z;
}
// 溢出判断
int overflow(int z) {
return z > INT_MAX/10 ||(z == INT_MAX/10 && a%10 > INT_MAX%10) // 溢出判断
z > INT_MAX/10
,必然会溢出。z == INT_MAX/10
&&那么乘以10不会溢出,但是还需要判断加上后面的数是否会溢出也就是 加的数是否会大于最大值的最后一位。a%10 > INT_MAX%10)