您的位置:首页 > 其它

位运算的奇思妙想之i&(-i)

2016-08-11 11:42 204 查看
相信大家对i&(-i)并不陌生,毕竟树状数组里必定会用到

那么该运算到底实现了什么功能呢?

看以下代码:

/*Sherlock and Watson and Adler*/
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<cmath>
#include<complex>
#include<string>
#include<algorithm>
#include<iostream>
#define eps 1e-9
#define LL long long
#define bitnum(a) __builtin_popcount(a)
using namespace std;
const int N = 21;
const int M = 10005;
const int inf = 1000000007;
const int mod = 1000000007;
int main()
{
for(int i=1;i<=16;i++)
printf("i =%2d,i&(-i) =%2d\n",i,i&(-i));
return 0;
}
结果为:



由此可见,i&(-i)运算的功能为返回 i 的二进制数表示为1的最低位的权值

比如说,十进制数6,二进制数表示为110,为1的最低位权值是2;

再比如说十进制数20,二进制数表示为10100,为1的最低位权值是4;

而十进制数7,二进制表示为111,它的为1的最低位权值则是1

好了,经过这么一遍解释,你是否对i&(-i)运算有点了解了呢?继续你们的acmer之旅吧!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: