位运算膜法
n的第k位数是几
先把这个数字移动k位
然后再判断个位是什么
lowbit(x)是返回最后的一位1
x = 101010 最后一位1
~x = 010101 最后一位1
~x + 1 就会导致最后一位0变成1,然后全部都被取出来了
补码的意义
-x就是x的补码
补码就是~x+1
原数字找到最后一个1,找到把左边的数全部取反
原码,反码,补码
原码就是自己
反码就是全部取反
补码是~x + 1
底层实现是没有减法的。用加法来做减法
\(x + (-x) = 0\)
\((-x) = 0 - x\)
\((-x) = 0 - x\)等于32位0减去x
其实就是借了一位再减x
二进制中1的个数
#include<cstdio>
#include<iostream>
using namespace std;
int lowbit(int x)
{
return x & -x;
}
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++)
{
int x;
int res = 0;
cin >> x;
while(x) x -= lowbit(x), res++;
cout << res << " ";
}
return 0;
}
有什么问题可以加qq:1281372141进行交流