二进制数1的个数及两二进制数异或后1的个数的奇偶

二进制数1的个数

判断二进制数1的个数,通过x &= x-1来不断消掉x的最右面的一位1,通过消除次数判断x的1的个数
例如x=0100,则x-1=0011,(x &= x-1) =0000,所以x中的1的个数为1

//常规方法判断x的二进制中1的个数
int onescount(int x){
   int cnt = 0;
   while(x){
   	cnt++;
   	x &= x-1;
   }
   return cnt;
}

//预处理1-len的每个i的二进制数的1的个数
for(int i = 1; i < len; ++i) bits[i]=bits[i^(i&-i)]+1;

//C++内置函数__builtin_popcount(i)求取i的二进制数有多少1
for(int i = 1; i < len; ++i) bits[i]=__builtin_popcount(i);

两个二进制数异或后1的个数的奇偶

假设两个二进制数分别为a,b,长度均为len
a中有x个0,len-x个1
b中有y个0,len-y个1
a^b后1的来源有(0,1),(1,0)这两个异或
假设a中的x个0有k个和b中的1进行异或产生1,那么剩下的x-k个0和b中的0异或
b中的0有x-k个被a中的0异或,剩下的y-x+k个0和a中的1异或产生1

因此a、b异或后产生的1的总数量为 y − x + 2 k y-x+2k yx+2k,其中 2 k 2k 2k为偶数,所以我们只需要判断y-x的奇偶性就可以了。(不需要管y-x的正负,因为可以将2k加到y上面,不会改变y的奇偶性,而整个式子是严格大于等于0的)
那么
奇数-奇数和偶数-偶数都是偶数
奇数-偶数和偶数-奇数都是奇数

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值