整数问题及位运算的一些总结

整数问题常见例题:

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值