数据结构和算法

DSA 主页 DSA 概述 DSA 环境设置 DSA 算法基础 DSA 渐近分析

数据结构

DSA 数据结构基础 DSA 数据结构和类型 DSA 数组数据结构

链接列表

DSA 链接列表数据结构 DSA 双向链接列表数据结构 DSA 循环链表数据结构

堆栈 &队列

DSA 堆栈数据结构 DSA 表达式解析 DSA 队列数据结构

搜索算法

DSA 搜索算法 DSA 线性搜索算法 DSA 二分搜索算法 DSA 插值搜索 DSA 跳跃搜索算法 DSA 指数搜索 DSA 斐波那契搜索 DSA 子列表搜索 DSA 哈希表

排序算法

DSA 排序算法 DSA 冒泡排序算法 DSA 插入排序算法 DSA 选择排序算法 DSA 归并排序算法 DSA 希尔排序算法 DSA 堆排序 DSA 桶排序算法 DSA 计数排序算法 DSA 基数排序算法 DSA 快速排序算法

图形数据结构

DSA 图形数据结构 DSA 深度优先遍历 DSA 广度优先遍历 DSA 生成树

树数据结构

DSA 树数据结构 DSA 树遍历 DSA 二叉搜索树 DSA AVL 树 DSA 红黑树 DSA B树 DSA B+ 树 DSA 伸展树 DSA 尝试 DSA 堆数据结构

递归

DSA 递归算法 DSA 使用递归的汉诺塔 DSA 使用递归的斐波那契数列

分而治之

DSA 分而治之 DSA 最大最小问题 DSA 施特拉森矩阵乘法 DSA Karatsuba 算法

贪婪算法

DSA 贪婪算法 DSA 旅行商问题(贪婪方法) DSA Prim 最小生成树 DSA Kruskal 最小生成树 DSA Dijkstra 最短路径算法 DSA 地图着色算法 DSA 分数背包问题 DSA 作业排序截止日期 DSA 最佳合并模式算法

动态规划

DSA 动态规划 DSA 矩阵链乘法 DSA Floyd Warshall 算法 DSA 0-1 背包问题 DSA 最长公共子序列算法 DSA 旅行商问题(动态方法)

近似算法

DSA 近似算法 DSA 顶点覆盖算法 DSA 集合覆盖问题 DSA 旅行商问题(近似方法)

随机算法

DSA 随机算法 DSA 随机快速排序算法 DSA Karger 最小割算法 DSA Fisher-Yates 洗牌算法

DSA 有用资源

DSA 问答 DSA 快速指南


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