位运算

奇偶性

int a;
cin >> a;
if (a & 1)
     cout << "奇数" << endl;
if ((a & 1) == 0)    //注意:&的优先级低于==的优先级,因此if内部与运算必须加括号!
    cout << "偶数" << endl;

2、 不借助变量交换两个数

3 取相反数

//求某整数的绝对值
int my_abs(int number) {
	if (number < 0) {
		return ~number + 1; //或return -number; 或return ~(n - 1)
	}
	return number;
}

4、整数二进制表示中最右边的1
获取整数二进制表示中最右侧的1:n & (-n) 等价于 n & ~(n - 1) 。

例如,n = 1100, -n = 0100, 那么n & (-n) = 0100,这样就获取到了二进制表示中最右侧的1。

去除整数二进制表示中最右侧的1:n & (n - 1)

例如,n = 1100,n - 1 = 1011,那么n & (n - 1) = 1000,这样就去除了二进制表示中最右侧的1。

在文章位操作实现加减乘除四则运算中的乘法操作就用到了本小结提到的这两个技巧。

5、32位系统某数右移/左移32位或更多位
在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。

参考文章:位移操作的另类情况

https://www.zhihu.com/question/32225726

1、二进制中1的个数
用到了n & (n - 1)

(1)方法一:参考文章:整数的二进制表示中1的个数

方法二:二进制位的翻转和二进制表示中1的个数

(2) 输入两个数A和B,输出将A转换为B所需改变的二进制的位数。

方法:首先,A异或B得到的是A和B中不相同位数组成的数,然后再求这个数二进制表示中1的个数,即为所求。

2、数组中只出现一次的数字
用到了n & (n - 1)

数组中仅出现一次的一个数字、仅出现一次的两个数字

参考文章:http://zhedahht.blog.163.com/blog/static/2541117420071128950682/

数组中仅出现一次的三个数字

参考文章:http://zhedahht.blog.163.com/blog/static/25411174201283084246412/

3、不用加减乘除做加法
参考文章:http://zhedahht.blog.163.com/blog/static/254111742011125100605/

4、位操作实现加减乘除运算
位操作实现加减乘除四则运算

5、不借助变量交换两个数
参考文章:不借助变量交换两个数

6、比较两个数大小
参考文章:不借助if、switch等语句求两个数较大的一个

7、二进制位的翻转
字符串合并处理(二进制位的倒序)

二进制位的翻转

8、二进制表示的高低位交换
http://blog.csdn.net/morewindows/article/details/7354571

9、位操作与空间压缩
http://blog.csdn.net/morewindows/article/details/7354571#t6

10、bitmap对海量数据排序
bitmap对海量无重复的整数排序

11、求两个数中较小的那个
y ^ ((x ^ y) & -(x < y))

分析:当x < y时,-(x < y)为-1,其补码形式全为1,则(x ^ y) & -(x < y) = x ^ y,则上述表达式返回的是较小的数x;

当x >= y时,-(x < y)为0,补码形式为全0,则(x ^ y) & -(x < y) = 0, 则表达式返回的是较小的数y。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值