位运算的奇思妙想之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之旅吧!!!
那么该运算到底实现了什么功能呢?
看以下代码:
/*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之旅吧!!!
相关文章推荐
- Acdream 1210 Chinese Girls' Amusement(大数模板运算 + 找规律)
- bytes[i] & 0xf0是怎么运算的
- 二进制运算&逻辑运算
- C 的|、||、&、&&、异或、~、!运算
- Objective-C 数据类型和运算…
- js短路运算&& 和 ||
- C/C++ 中 & 与 * 运算
- java中&和&&是怎么运算的
- HDU 1021/ZOJ 2060 Fibonacci Again(数论&整除推导&位运算技巧)
- 位运算(&、|、^)与逻辑运算(&&、 ||)区别
- [笔试题 12][c/c++]递归的妙用,&&,||运算的截断
- bytes[i] & 0xf0是怎么运算的
- C语言中&操作符可以进行哪些运算?
- Js 逻辑运算&&和||
- ARM C嵌套汇编&NEON运算小例子
- 逻辑运算表达式&&或||
- <2>反拜耳运算
- 位运算 >>、 << 、>>> 、|、 &、~
- 位运算之——按位与(&)操作——(快速取模算法)
- 位移,&,|,^运算