• C++
  • 位运算-二进制中1的个数

  • @ 2024-1-6 15:58:30

二进制中1的个数

image

C++ 中的位运算允许你对整数类型的变量进行按位操作,如按位与(&)、按位或(|)、按位异或(^)、按位取反(~)等。这些操作符可以直接应用于整数,且不依赖于任何其他类型。

下面是位运算符的一些示例和说明:

  1. 按位与(&): 对两个整数的每一位进行与运算。只有当两个相应的二进制位都为1时,结果的相应位才为1,否则为0。
int a = 60;  // 60 = 0010 1100
int b = 13; // 13 = 0000 1101
int c = a & b; // c = 0000 1000 = 8
  1. 按位或(|): 对两个整数的每一位进行或运算。当两个相应的二进制位中至少有一个为1时,结果的相应位为1,否则为0。
int a = 60;  // 60 = 0010 1100
int b = 13; // 13 = 0000 1101
int c = a | b; // c = 0010 1101 = 61
  1. 按位异或(^): 对两个整数的每一位进行异或运算。当两个相应的二进制位相同时为0,否则为1。
int a = 60;  // 60 = 0010 1100
int b = 13; // 13 = 0000 1101
int c = a ^ b; // c = 0010 0001 = 49
  1. 按位取反(~): 对一个整数的每一位进行取反运算,即把所有的1变为0,把所有的0变为1。
int a = ~65; // a = -66, 因为65的二进制表示是"1000 0001",取反后为"..1111 1110",即-66。
  1. 左移(<<): 将一个整数的所有二进制位向左移动指定的位数,右侧用0填充。
  2. 有符号右移(>>): 将一个整数的所有二进制位向右移动指定的位数,左侧根据符号位来填充。对于正数,左侧填充为0;对于负数,左侧填充为1。

请注意,这些位运算符通常用于低级编程任务,如硬件交互、网络编程或性能关键型任务。在常规应用程序开发中,你可能会更少使用这些运算符,但在需要高效处理数据时,它们是非常有用的工具。

C++ 中的位运算是一种低级操作,用于对整数类型的变量进行按位操作。以下是 C++ 位运算的一些知识点和代码示例:

知识点:

  1. 位运算是对整数类型的变量进行按位操作,包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)等。
  2. 位运算符可以用于整数的每一位,根据不同的运算符进行与、或、异或等运算。
  3. 位运算符通常用于低级编程任务,如硬件交互、网络编程或性能关键型任务。

代码示例:

  1. 按位与(&):
#include <iostream>
using namespace std;

int main() {
    int a = 60;  // 60 = 0010 1100
    int b = 13; // 13 = 0000 1101
    int c = a & b; // c = 0000 1000 = 8
    cout << c << endl;
    return 0;
}
  1. 按位或(|):
#include <iostream>
using namespace std;

int main() {
    int a = 60;  // 60 = 0010 1100
    int b = 13; // 13 = 0000 1101
    int c = a | b; // c = 0010 1101 = 61
    cout << c << endl;
    return 0;
}
  1. 按位异或(^):
#include <iostream>
using namespace std;

int main() {
    int a = 60;  // 60 = 0010 1100
    int b = 13; // 13 = 0000 1101
    int c = a ^ b; // c = 0010 0001 = 49
    cout << c << endl;
    return 0;
}
  1. 按位取反(~):
#include <iostream>
using namespace std;

int main() {
    int a = ~65; // a = -66, 因为65的二进制表示是"1000 0001",取反后为"..1111 1110",即-66。
    cout << a << endl;
    return 0;
}

1 条评论

  • @ 2024-1-6 16:00:47
    #include <iostream>
    using namespace std;
    const int N = 100010;
    int a[N];
    int main()
    {
        int n;
        scanf("%d",&n);
    
        for(int i = 0 ; i < n ; i ++)
        { 
            scanf("%d", &a[i]);
            int sum = 0;
            //循环二进制最大表示数 &1 表示补一 偶数变1
            for(int k = 31 ; k >= 0 ; k --)
            {
                if ((a[i] >> k & 1) == 1) sum ++;
            }
            printf("%d ", sum);
        }
    
        return 0;
    }
    
  • 1