整数问题常见例题:
1)atoi
2) reverse 比如-123 -> -321
用long 存reverse后的值,以防溢出。 正负数统一处理:用x != 0 而不是 x > 0作为条件,需要%的语义为异号为负
int reverse(int x) {
long long v = 0;
for (; x != 0; x /= 10) {
v = v * 10 + x % 10;
if (v > INT_MAX || v < INT_MIN) return 0;
}
return v;
}
3) reverse bits
uint32_t reverseBits(uint32_t n) {
uint32_t ans = 0;
for (int i = 0; i < sizeof(n) * 8; n >>= 1, ++i)
ans = (ans << 1) + (n & 1);
return ans;
}
4)判断是否是2的幂
5)对某一位赋值
注意溢出问题,比如atoi, reverse number,结果本身可能溢出。算法过程中,也不能随便用abs 或者取反, abs(n) 和 -n都可能溢出
位运算:
1把最右边的1清零, x & ( x - 1) ,应用:
1)数1的个数
2)判断是否是2的整数幂
2 取第i位的值:(x >> i) & 1
3 对第i 位取反 : x ^ (1 << i) 跟0亦或是本身,跟1亦或是取反
4对第i位赋值 v
通用的方法是 if (((x >> i) & 1) != v ) x = x ^ (1<< i) 判断第i位跟要赋的值是否相同,不同的话对第i 位取反
如果已知被赋值的数第i 位为0(例如是一个初始化为0的数): x |= v << i