首页 > 其他分享 >深入理解按位操作符:位运算的魅力

深入理解按位操作符:位运算的魅力

时间:2023-10-01 11:32:14浏览次数:31  
标签:运算 二进制 STATE 操作符 按位 public currentState


最近在审阅他人的代码时,我意外地发现了一个按位赋值操作符。由于之前的开发经验中从未接触过这种操作符,我决定进行了一番深入的资料研究。我发现,尽管它们可能不如一些更常见的操作符广泛使用,但在某些情况下,它们可以成为解决问题的强大工具。在本文中,我们将深入探讨按位操作符,详细了解它们的工作原理以及它们在编程中的实际应用场景。

什么是按位操作符?

按位操作符

按位操作符是一组用于执行位级别操作的特殊操作符。它们作用在整数类型的数据的二进制表示中的每个位上,允许程序员以位为单位执行各种操作。在大多数编程语言中,常见的按位操作符包括 &(与)、|(或)、^(异或)、~(非)等。

按位赋值操作符

按位赋值操作符 |=&=^= 是复合赋值运算符,它们分别结合了按位或 |、按位与 & 和按位异或 ^ 操作符以及赋值操作符 =。这些操作符的作用是将一个变量的当前值与另一个值进行相应的位操作,然后将结果赋值给该变量。

  • a |= b:将变量 a 的值与变量 b 的值进行按位或操作,并将结果赋值给 a。
  • a &= b:将变量 a 的值与变量 b 的值进行按位与操作,并将结果赋值给 a。
  • a ^= b:将变量 a 的值与变量 b 的值进行按位异或操作,并将结果赋值给 a。

注意:~操作符是一个一元操作符,而 = 是赋值操作符,所以不能和等号联合使用

运算符及运算规则

**运算符

含义

运算规则**

&

按位与

将两个二进制数的对应位相与,只有当两个位都为1时,结果位才为1,否则为0

|

按位或

将两个二进制数的对应位相或,只有当两个位都为0时,结果位才为0,否则为1

^

按位异或

将两个二进制数的对应位进行异或运算,如果两个位不同,则结果位为1,否则为0

~

按位取反/非

将翻转二进制数每个位的值,将0变为1,将1变为0

示例

  • 按位与
5 & 3 = 1 

//5 二进制表示为 00000101
//3 二进制表示为 00000011
//1 二进制表示为 00000001
  • 按位或
5 | 3 = 7

//5 二进制表示为 00000101
//3 二进制表示为 00000011
//7 二进制表示为 00000111
  • 按位异或
5 ^ 3 = 6 

//5 二进制表示为 00000101
//3 二进制表示为 00000011
//6 二进制表示为 00000110
  • 按位取反/非
~5  = -6 

//5  二进制表示为 00000101
//-6 二进制表示为 11111010

应用

这些按位赋值操作符在许多编程场景中都有广泛的应用。以下是一些示例和用例:

管理状态标志

状态标志位用于表示某个条件是否满足或某个状态是否激活。您可以使用 |= 来设置标志位,使用 &= 来清除标志位。

public class StateManager {
    private int currentState = 0;

    // 状态标志
    private static final int STATE_A = 1; // 0001
    private static final int STATE_B = 2; // 0010
    private static final int STATE_C = 4; // 0100

    // 设置状态标志
    public void setStateA() {
        currentState |= STATE_A; // 启用状态A
    }

    public void setStateB() {
        currentState |= STATE_B; // 启用状态B
    }

    public void setStateC() {
        currentState |= STATE_C; // 启用状态C
    }

    // 检查状态
    public boolean isStateA() {
        return (currentState & STATE_A) != 0; // 检查状态A是否已启用
    }

    public boolean isStateB() {
        return (currentState & STATE_B) != 0; // 检查状态B是否已启用
    }

    public boolean isStateC() {
        return (currentState & STATE_C) != 0; // 检查状态C是否已启用
    }

    // 清除状态标志
    public void clearStateA() {
        currentState &= ~STATE_A; // 禁用状态A
    }

    public void clearStateB() {
        currentState &= ~STATE_B; // 禁用状态B
    }

    public void clearStateC() {
        currentState &= ~STATE_C; // 禁用状态C
    }

    // 其他操作
    // ...
}

权限管理

在权限管理中,可以使用 |= 来为用户动态授予权限,使用 &= 来撤销权限。

int userPermissions = 0;
int READ_PERMISSION = 1;    // 0001
int WRITE_PERMISSION = 2;   // 0010

// 赋予用户读权限
userPermissions |= READ_PERMISSION; // 用户现在拥有了读权限

// 撤销用户写权限
userPermissions &= ~WRITE_PERMISSION; // 用户不再拥有写权限

位掩码操作

位掩码是用于启用或禁用多个选项或开关的常见工具。通过使用 |= 和 &=`,您可以设置或清除位掩码中的特定位。

int options = 0;
int OPTION1 = 1; // 0001
int OPTION2 = 2; // 0010

// 启用 OPTION1
options |= OPTION1; // options 变为 0001

// 禁用 OPTION2
options &= ~OPTION2; // options 变为 0001 & ~0010 = 0001

数据加密和解密

按位异或操作符 ^ 在数据加密和解密中经常被使用。通过 ^=,您可以对数据进行加密和解密操作。

byte data = 0x5A; // 01011010
byte key = 0x3C;  // 00111100

// 数据加密
data ^= key; // data 变为 01100110

// 数据解密
data ^= key; // data 变回 01011010

结论

尽管按位操作符在日常编程中并不经常使用,但它们是强大的工具,可以用于许多不同的情况。通过深入理解这些操作符的工作原理和实际应用,程序员可以更好地利用它们来解决问题,提高代码的效率和可读性。希望这篇文章能帮助您更好地理解按位操作符并在编程中充分利用它们的潜力。


标签:运算,二进制,STATE,操作符,按位,public,currentState
From: https://blog.51cto.com/xiuji/7672499

相关文章

  • 算术运算器
    需求分析:1、设计一个运算类,里面有四个成员函数,负责进行加减乘除的运算2、设计一个管理运算类,里面包含两个运算数和运算符号的成员,并且有一个正确答案的成员,这个正确答案的成员的数值由“运算类”的成员函数计算得出3、使用“管理类”的成员函数访问两个运算数和运算符号让用户计......
  • 结对项目,用C++实现的四则运算
    软件工程计科一班陈倚星-3119000414,甫尔达吾斯.吐拉江-3119000416作业要求与班上同学组队完成项目作业目的提高合作与团队意识GitHub链接https://github.com/xingch123456789/my_appPSP表格PSP2.1PersonalSoftwareProcessStages预估耗时(分钟......
  • 实验1 C语言开发环境使用和数据类型.运算符.表达式
    task1.c代码#include<stdio.h>intmain(){printf("O\n");printf("<H>\n");printf("II\n");return0;} 运行结果  task1_2.c代码 #include<stdio.h>intmain(){printf(&quo......
  • C中三元运算符的优先级
    优先级很低,往往需要加一个括号在求二叉树的高度遇到的问题,属于对C不熟悉导致的bug//ret的值为20,ret1的值是22inta=10,b=20;intret=2+a>b?a:b;//先计算2+a,2+a>b为假,因此ret的值是20intret1=2+(a>b?a:b);//先计算(a>b?a:b),然后再计算2+......
  • C++友元和运算符重载
    友元classbuiding{friendvoidGoodboy(buiding*bui);public:intm_age;private:intm_size;};//全局函数voidGoodboy(buiding*bui){cout<<bui->m_age<<endl;//可以调用public中的m_agecout<<bui->m_size<<endl;//m_size调用需要声明友元}私有......
  • 结对项目:用C++实现四则运算
    软工作业3:自动生成小学四则运算题目的命令行程序这个作业属于哪个课程计科21级12班这个作业要求在哪里结对项目这个作业的目标熟悉合作开发流程项目Github点击这里团队成员姓名学号石云欣3221004809沈纪康3121004750PSP表PSP2.......
  • 结对项目:python开发四则运算的程序
    项目链接软件工程软件工程链接作业要求作业要求的链接作业目标两人用python实现一个自动生成小学四则运算题目的命令行程序github项目链接github项目链接团队成员姓名学号李金强3121004868赵继业31210048901.PSP表格PSP表格通常用......
  • 结对项目:自动生成小学四则运算题目
    用Python实现一个自动生成小学四则运算题目的命令行程序 软件工程计科21级12班(广东工业大学-计算机学院)作业要求结对项目作业目标熟悉结对编程 成员姓名班级学号黄翼山计算机科学与技术2021级2班3119004783扎恩哈尔·吾兰计算机科学......
  • 结对项目:用Python实现自动生成小学四则运算题目的程序
    Python实现四则运算程序软件工程计科21级1.2班作业要求https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13016作业目标完成结对项目:四则运算;熟悉团队协作的方法和模式github链接:https://github.com/howdnb/howdnb项目成员信息姓名学号......
  • 结对项目:实现一个自动生成小学四则运算题目的命令行程序
    1作业摘要与结对伙伴介绍1.1作业摘要这个作业属于哪个课程所属课程链接这个作业要求在哪里作业要求链接这个作业的目标<熟悉软件工程流程,把握PSP流程框架,精进测试代码和性能改进的能力>Github链接1.2结对伙伴信息姓名学号彭学智3121004878......