DSA - 按位算法
按位算法简介
按位算法是控制数据各个位操作的算法。这些算法主要用于提高运算速度和内存效率,尤其是在处理大型数据集时。
什么是位?
计算机无法理解人类语言,它需要用位编码的数据。这里,位是计算机中最小的信息单位。它由只有两个值的二进制数字表示,即0和1。它的其他表示形式包括YES或NO、TRUE或FALSE以及ON或OFF。
位操作(运算符)
位操作是一种对数据的各个位执行低级操作的技术,例如加密、切换、移位或屏蔽。对位执行的操作称为按位操作。此操作需要一个或两个操作数,首先将其转换为二进制,然后将运算符应用于每对相应的位。此操作的结果也是一个二进制数。
位操作可用于多种用途,例如 −
它可用于实现需要直接访问数据二进制表示的低级算法或数据结构,例如加密、压缩、散列或密码学。
它可以通过减少执行给定任务(例如算术、逻辑或位计数)所需的指令或字节数来优化性能或内存使用率。
位操作还用于操作使用特定位来控制设备行为或状态的硬件寄存器或设备驱动程序。
为了执行位操作,我们使用各种按位运算符。它们解释如下 −
按位与运算符 (&)
单个 & 符号 (&) 表示按位与运算符。它接受两个操作数,如果两个位都为 1,则返回 1,否则返回 0。
示例
在下面的示例中,我们将演示各种编程语言中的与运算。
#include <stdio.h>
int main() {
int valOne = 8;
int valTwo = 9;
int output = valOne & valTwo;
printf("AND 运算的结果: %d
", output);
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int valOne = 8;
int valTwo = 9;
int output = valOne & valTwo;
cout << "AND 运算的结果: " << output << endl;
return 0;
}
public class Main {
public static void main(String[] args) {
int valOne = 8;
int valTwo = 9;
int output = valOne & valTwo;
System.out.println("AND 运算的结果: " + output);
}
}
valOne = 8
valTwo = 9
output = valOne & valTwo
print("AND 运算的结果:", output)
输出
AND 运算的结果: 8
按位或运算符 (|)
单管道符号 (|) 表示按位或运算符。它接受两个操作数作为参数值,如果其中任意一位为 1,则返回 1,否则返回 0。
示例
以下示例演示了按位或运算符在不同编程语言中的工作原理。
#include <stdio.h>
int main() {
int valOne = 8;
int valTwo = 9;
int output = valOne | valTwo;
printf("或运算的结果: %d
", output);
return 0;
}
#include <iostream>
using namespace std;
int main() {
int valOne = 8;
int valTwo = 9;
int output = valOne | valTwo;
cout << "或运算的结果: " << output << endl;
return 0;
}
public class Main {
public static void main(String[] args) {
int valOne = 8;
int valTwo = 9;
int output = valOne | valTwo;
System.out.println("或运算的结果: " + output);
}
}
valOne = 8
valTwo = 9
output = valOne | valTwo
print("或运算的结果:", output)
输出
或运算的结果: 9
按位异或运算符 (^)
按位异或运算符用脱字符号 (^) 表示。它也接受两个操作数,如果位不同则返回 1,否则返回 0。
示例
以下示例展示了按位异或运算符的工作原理。
#include <stdio.h>
int main() {
int valOne = 8;
int valTwo = 9;
int output = valOne ^ valTwo;
printf("异或运算结果: %d
", output);
return 0;
}
#include <iostream>
using namespace std;
int main() {
int valOne = 8;
int valTwo = 9;
int output = valOne ^ valTwo;
cout << "异或运算结果: " << output << endl;
return 0;
}
public class Main {
public static void main(String[] args) {
int valOne = 8;
int valTwo = 9;
int output = valOne ^ valTwo;
System.out.println("异或运算结果: " + output);
}
}
valOne = 8
valTwo = 9
output = valOne ^ valTwo
print("异或运算结果:", output)
输出
异或运算结果: 1
按位非运算符 (~)
按位非运算符用单个波浪符号 (~) 表示。它接受 1 或 0 作为操作数,并返回该操作数的补码,这意味着它将每个位从 0 翻转为 1,将 1 翻转为 0。
示例
以下示例演示了非运算符在各种编程语言中的工作原理。
#include <stdio.h>
int main() {
int value = 0;
int output = ~value;
printf("非运算的结果:%d
", output);
return 0;
}
#include <iostream>
using namespace std;
int main() {
int value = 0;
int output = ~value;
cout << "非运算的结果:" << output << endl;
return 0;
}
public class Main {
public static void main(String[] args) {
int value = 0;
int output = ~value;
System.out.println("非运算的结果:" + output);
}
}
value = 0
output = ~value
print("Result of NOT operation:", output)
输出
非运算的结果:-1
左移运算符 (<<)
双左箭头符号 (<<) 表示左移运算符。它用于将操作数的指定位向左移动给定位数。空出的位用零填充。
示例
在下面的示例中,我们将演示各种编程语言中的左移运算。
#include <stdio.h>
int main() {
int value = 11;
// int 到二进制的转换
char newVal[5];
for(int i = 3; i >= 0; i--) {
newVal[3-i] = ((value >> i) & 1) ? '1' : '0';
}
newVal[4] = '\0';
int output = value << 2;
printf("值的二进制表示: %s
", newVal);
printf("左移运算的结果: %d
", output);
return 0;
}
#include <iostream>
#include <bitset>
using namespace std;
int main() {
int value = 11;
// int 到二进制的转换
string newVal = bitset<4>(value).to_string();
int output = value << 2;
cout << "值的二进制表示: " << newVal << endl;
cout << "左移运算的结果: " << output << endl;
return 0;
}
public class Main {
public static void main(String[] args) {
int value = 11;
// int 到二进制的转换
String newVal = Integer.toBinaryString(value);
int output = value << 2;
System.out.println("值的二进制表示: " + newVal);
System.out.println("左移运算的结果: " + output);
}
}
value = 11
# int to binary conversion
newVal = format(value, '04b')
output = value << 2
print("值的二进制表示:", newVal)
print("左移运算的结果:", output)
输出
值的二进制表示: 1011 左移运算的结果: 44
右移运算符 (>>)
双右箭头符号 (>>) 表示右移运算符。它用于将操作数的指定位向右移动给定的位数。它会用零或符号位填充空出的位(取决于操作数是有符号的还是无符号的)。
示例
以下示例演示了右移运算在各种编程语言中的工作原理。
#include <stdio.h>
int main() {
int value = 11;
// int 到二进制的转换
char newVal[5];
for(int i = 3; i >= 0; i--) {
newVal[3-i] = ((value >> i) & 1) ? '1' : '0';
}
newVal[4] = '\0';
int output = value >> 2;
printf("值的二进制表示: %s
", newVal);
printf("右移运算的结果: %d
", output);
return 0;
}
#include <iostream>
#include <bitset>
using namespace std;
int main() {
int value = 11;
// int 到二进制的转换
string newVal = bitset<4>(value).to_string();
int output = value >> 2;
cout << "值的二进制表示: " << newVal << endl;
cout << "右移运算的结果: " << output << endl;
return 0;
}
public class Main {
public static void main(String[] args) {
int value = 11;
// int 到二进制的转换
String newVal = Integer.toBinaryString(value);
int output = value >> 2;
System.out.println("值的二进制表示: " + newVal);
System.out.println("右移运算的结果: " + output);
}
}
value = 11
# 整数到二进制的转换
newVal = format(value, '04b')
output = value >> 2
print("值的二进制表示:", newVal)
print("右移运算的结果:", output)
输出
值的二进制表示: 1011 右移运算的结果: 2

