- C++
位运算-二进制中1的个数
- 2024-1-6 15:58:30 @
二进制中1的个数
C++ 中的位运算允许你对整数类型的变量进行按位操作,如按位与(&)、按位或(|)、按位异或(^)、按位取反(~)等。这些操作符可以直接应用于整数,且不依赖于任何其他类型。
下面是位运算符的一些示例和说明:
- 按位与(&): 对两个整数的每一位进行与运算。只有当两个相应的二进制位都为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,否则为0。
int a = 60; // 60 = 0010 1100
int b = 13; // 13 = 0000 1101
int c = a | b; // c = 0010 1101 = 61
- 按位异或(^): 对两个整数的每一位进行异或运算。当两个相应的二进制位相同时为0,否则为1。
int a = 60; // 60 = 0010 1100
int b = 13; // 13 = 0000 1101
int c = a ^ b; // c = 0010 0001 = 49
- 按位取反(~): 对一个整数的每一位进行取反运算,即把所有的1变为0,把所有的0变为1。
int a = ~65; // a = -66, 因为65的二进制表示是"1000 0001",取反后为"..1111 1110",即-66。
- 左移(<<): 将一个整数的所有二进制位向左移动指定的位数,右侧用0填充。
- 有符号右移(>>): 将一个整数的所有二进制位向右移动指定的位数,左侧根据符号位来填充。对于正数,左侧填充为0;对于负数,左侧填充为1。
请注意,这些位运算符通常用于低级编程任务,如硬件交互、网络编程或性能关键型任务。在常规应用程序开发中,你可能会更少使用这些运算符,但在需要高效处理数据时,它们是非常有用的工具。
C++ 中的位运算是一种低级操作,用于对整数类型的变量进行按位操作。以下是 C++ 位运算的一些知识点和代码示例:
知识点:
- 位运算是对整数类型的变量进行按位操作,包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)等。
- 位运算符可以用于整数的每一位,根据不同的运算符进行与、或、异或等运算。
- 位运算符通常用于低级编程任务,如硬件交互、网络编程或性能关键型任务。
代码示例:
- 按位与(&):
#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;
}
- 按位或(|):
#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;
}
- 按位异或(^):
#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;
}
- 按位取反(~):
#include <iostream>
using namespace std;
int main() {
int a = ~65; // a = -66, 因为65的二进制表示是"1000 0001",取反后为"..1111 1110",即-66。
cout << a << endl;
return 0;
}
1 条评论
-
mrhowe SU @ 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