#include<iostream>
using namespace std;
int main()
{
int a;
cin>>a;
cout<< (a&(-a) );//最后得小位权
cout<< (a & (a-1)) //结果是a减去了小的位权
}
a&(a-1) 的结果是 将二进制a中最低位的1改成了0,也就是从a中减去了最小的权。
假设 a的二进制形式 ?????1000,那么 a-1就是 ????0111。那么a&(a-1)就是????0000。即找到a的二进制数的最后一个1,减1之后,这个1的位置变成0,之后的位变成1。&运算之后,这个1及之后的位置全是0。
a&(-a) 比较a与-a的二进制数的区别:
我们由a的二进制数生成-a
a= ?????10…0 找到最低位的1
-a=?????01…1+1 反码+1
比较这两个被,?处是相反的,而最低位的1及之后相同
所以 a&(-a)=0000010…0 这个1仍是最低位的1。