位运算(两种常见的位运算)

判断n的二进制表示的第k位是多少

假设:n = 15 = (1111)2

step1:先把第k位移到最后一位,即x = n>>k

step2:看个位数是几,x&1

step3:k位置上的数为,n>>k&1

/*
输出数n从低位到高位的前4个二进制的数
*/
#include
using namespace std;

int main(){
    
    int n,k;
    scanf("%d",&n,&k);
    for(int k = 3;k>=0;k--) cout<<(n>>k & 1);
    return 0;

}

lowbit(x)的操作:返回的是x的最后一位1

x & -x  =  x&(-x + 1)

x: 1010...100....0

-x: 0101...011....1

-x+1: 0101...100...0

x&(-x+1) = 0......010....0

例题:

给定一个长度为 nn 的数列,请你求出数列中每个数的二进制表示中 11 的个数。

输入格式

第一行包含整数 nn。

第二行包含 nn 个整数,表示整个数列。

输出格式

共一行,包含 nn 个整数,其中的第 ii 个数表示数列中的第 ii 个数的二进制表示中 11 的个数。

数据范围

1≤n≤1000001≤n≤100000,
0≤数列中元素的值≤1090≤数列中元素的值≤109

输入样例:

5
1 2 3 4 5

输出样例:

1 1 2 1 2
#include
using namespace std;

int lowbit(int k){
    return k&(-k);
}
int main(){
    int n,m;
    scanf("%d",&n);
    while(n--){
        scanf("%d",&m);
        int res = 0;
        while(m) m-=lowbit(m),res++;
        cout<

注意:程序设计语言中的-x其实表示的就是x的补码

补充:计算机中的数据的存储方式,在计算机中数据都是以二进制的补码的形式进行存储的。

正数:

原码:用二进制表示

反码:与原码相同

补码:与原码相同

负数:

原码:用二进制表示

反码:原码除了符号位,剩余位全部取反

补码:反码+1

你可能感兴趣的:(#,算法基础,c++,算法,开发语言,数据结构)