首页 > 其他分享 >位与运算(&)

位与运算(&)

时间:2023-08-02 15:25:50浏览次数:28  
标签:运算 二进制 用户 运算符 掩码 权限

目录

01 & 和两个&的区别

在Java中,&&& 都是逻辑运算符,用于执行布尔逻辑运算。它们之间有一些关键的区别:

  1. & 按位与运算符:& 运算符可用于对整型数据的每个位执行逐位的按位与运算。例如,int a = 5 & 3; 将得到 1,因为 5 的二进制表示为 101,而 3 的二进制表示为 011,两者进行按位与运算后为 001
  2. && 短路逻辑与运算符:&& 运算符执行短路逻辑与运算。它仅在左侧表达式为真(非零)时才会继续计算右侧表达式的值。如果左侧表达式为假(0),则不会执行右侧表达式的计算,并且整个条件表达式将被判定为假。这种行为称为短路求值。

下面是一个示例来说明两者的区别:

int a = 5;
int b = 3;

// 使用按位与运算符 &
int result1 = a & b; // 结果为 1

// 使用短路逻辑与运算符 &&
boolean result2 = (a > 0) && (b > 0); // 结果为 true
boolean result3 = (a > 0) && (b < 0); // 结果为 false,右侧表达式不会被计算

总结:

  • & 是按位与运算符,用于对整型数据的每个位进行按位与运算。
  • && 是短路逻辑与运算符,会根据左侧表达式的结果来决定是否执行右侧表达式的计算

02 什么是位与运算

位与运算是一种二进制运算,在计算机中常用于对整型数据的每个对应位执行逐位的按位与操作。它通常使用 & 运算符表示。

位与运算对两个操作数的每个对应位进行逻辑与操作,生成一个新的结果。在执行位与运算时,如果两个操作数的相应位都为 1,则结果的相应位也为 1;否则,结果的相应位为 0。

以下是位与运算的几个示例:

int a = 5;  // 二进制: 0101
int b = 3;  // 二进制: 0011

int result = a & b;// 二进制: 0001

System.out.println(result);  // 输出: 1

03 位与运算中的相应位是什么

位与运算(AND)是一种二进制运算,它的操作数是两个二进制数,按位进行比较,只有在对应位都为1时,结果才为1。位与运算中的相应位指的是两个二进制数中相同位置上的位

例如,假设我们有两个二进制数:10101010和11001100。在进行位与运算时,我们逐位比较这两个数,如果对应位都为1,则结果为1;否则,结果为0。

  10101010
& 11001100
-----------
  10001000

在上面的例子中,位与运算的结果是10001000。这意味着,在原始的两个二进制数中,第1位、第3位和第7位上的位都是1,而其他位都是0。

04 应用场景

位与运算在Java中有多种用途,以下是几个常见的应用场景:

  1. 清零特定位:通过将一个数与全为0、只有某些特定位为1的掩码进行位与运算,可以清零这些特定位上的值。例如,number & 0xFF可以将一个32位整数的高24位清零,只保留低8位的值。
  2. 判断奇偶性:通过对一个整数与1进行位与运算,可以判断它的最低位是0还是1,从而确定奇偶性。如果结果为0,则该数为偶数;如果结果为1,则该数为奇数。
  3. 权限控制:在权限控制中,每个权限可以用一个二进制位表示,不同的权限组合可以通过位与运算来判断用户是否具有某个特定的权限。例如,如果一个用户的权限是10101010,我们可以通过与某个特定的权限掩码进行位与运算来检查该用户是否具备该权限。
  4. 位标志(Bit Flags):位标志是一种使用二进制位来表示多个开关状态或选项的技术。通过对一个整数与不同的标志进行位与运算,可以判断哪些标志被设置为1,从而确定相应的状态或选项。

需要注意的是,位与运算通常在处理底层的位操作、性能优化或者特定算法中使用,对于一般的应用开发来说,并不常见。它需要对二进制数及其运算规则有一定的了解。

4.1 清零特定位

32位整数的高24位是指二进制表示中的最高24位。在一个32位整数中,从左到右依次为高位到低位。

例如,对于十进制数 305419896(二进制表示为 00010010001101000101011001111000),它的低8位是末尾的 01111000。高24位是指最左侧的24位,即为:000100100011010001010110

通常情况下,可以通过位与运算与一个掩码来提取整数的低8位。比如,使用掩码 0xFF(二进制表示为 00000000000000000000000011111111)可以将整数的高24位清零,只保留低8位的值。

4.2 位与运算如何控制权限

在权限控制中,位与运算可以用来检查用户是否具备某个特定的权限。假设每个权限都被分配一个唯一的二进制值,例如:

  • 读权限(READ):0001
  • 写权限(WRITE):0010
  • 执行权限(EXECUTE):0100

在用户管理中,每个用户被分配一组权限,可以使用一个整数或二进制数来表示。例如,用户A的权限是读和写权限,可以用二进制数为0011来表示。

当需要检查用户是否具备某个权限时,可以使用位与运算进行判断。具体步骤如下:

  1. 将用户的权限值与权限掩码进行位与运算。权限掩码是一个表示待检查的权限的二进制数,只有对应位为1,才需要检查该权限。例如,如果我们想要检查用户是否具备读权限,则权限掩码可以为0001。
  2. 对用户权限值与权限掩码进行位与运算。如果结果为0,则表示用户不具备该权限;如果结果不为0,则表示用户具备该权限。

示例: 假设用户A的权限值为0011,我们希望检查用户A是否具备读权限(READ)。首先,将用户的权限值与权限掩码0001进行位与运算。

  0011 (用户权限)
& 0001 (权限掩码 - 读权限)
-----------
  0001 (结果不为0,表示用户具备读权限)

根据位与运算的结果,我们可以判断用户A具备读权限。

使用位与运算进行权限控制的好处在于,每个权限都对应二进制数中的一个位,可以通过位与运算快速地检查用户是否具备某个权限,而不需要进行复杂的逻辑判断。此外,还可以方便地使用位标志(Bit Flags)来表示和组合多个权限,从而实现更灵活的权限控制。

4.3 位标志(Bit Flags)

位标志(Bit Flags)是一种使用二进制位来表示多个开关状态或选项的技术。它将一个整数或者字节中的每一位都分别用于表示某个特定的状态或选项,从而在一个变量中存储多个布尔值。

使用位标志可以有效地节省内存空间,因为每个开关状态只需要占据一个位,而不是单独使用一个变量或标志来表示。此外,位标志还方便进行逻辑运算和判断。

在位标志中,每个位都被分配给特定的含义。通常,我们使用二进制中的 0 和 1 来表示不同的状态或选项。例如,考虑以下场景:

假设有一个文件读写权限控制系统,其中包括三个权限:读权限、写权限和执行权限。我们可以使用一个字节(或者更大的整数类型)来表示这些权限的状态,其中每个位都代表一个权限的开关状态。

  • 读权限(READ):第 0 位
  • 写权限(WRITE):第 1 位
  • 执行权限(EXECUTE):第 2 位

通过设置或清除相应的位,我们可以控制特定权限的开启或关闭。例如,如果要给用户赋予读和执行权限,可以将该字节中的第 0 和第 2 位设置为 1。

使用位标志时,可以使用一些位操作运算符来进行位的设置、清除和判断,如位与(&)、位或(|)、位异或(^)等。这些运算符允许我们对位进行逻辑操作,以实现位标志的增删查改。

总结起来,位标志是一种使用二进制位来表示多个开关状态或选项的技术。它提供了一种有效而灵活的方式来存储和操作多个布尔值,并在许多应用场景中得到广泛应用,如权限控制、状态管理、选项设置等。

标签:运算,二进制,用户,运算符,掩码,权限
From: https://www.cnblogs.com/lyn8100/p/17600753.html

相关文章

  • java位运算及移位运算你还记得吗
    本文中所提到的运算都是基于整数来说的,因为只有整数(包括正数和负数)在操作系统中是以二进制的补码形式运算的,关于原码、反码、补码、位运算、移位运算的背景这里不再介绍,网上资料很多,感兴趣的可自行搜索。java中能表示整数数据类型的有byte、short、char、int、long,在计算机中占用......
  • 运算符重载
    运算符重载:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型1.加号运算符重载 2.左移运算符重载一般输出时 cout<<p.m_A<<""<<p.m_B<<endl; 但是现在想用<<直接输出p,(直接输出类类型的p, cout<<p<<endl; )该怎么办呢?利用成员函数重载 左移运算符  ......
  • ...扩展运算符
     目录前言导语 代码部分 运行结果前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语歌谣歌谣......
  • 【暑假例题】20230727 矩阵基本运算(C++)
    题目请使用C++实现矩阵的各种运算矩阵创建矩阵相加矩阵相减矩阵相乘数字乘矩阵矩阵上叠加矩阵左右叠加矩阵转置矩阵旋转矩阵求逆矩阵输出题目分析矩阵创建这里只需注意由于我们需要通过不同的函数对数组进行操作,所以我们需要将数组存储在容器或者使用指针防止数......
  • C++ | 运算符重载
    运算符重载在类中的函数进行重载(成员函数)运算符重载用于重新定义运算符的作用,使用函数名称operatorOP作为函数名,其中OP为具体的运算符(如operator+)classTime{Timeoperator+(constTime&t);};Timea,b;Timec=a+b;在成员函数中重载的运算符,如+-等,默认左边......
  • 可选链运算符(?.)的使用
    作用:读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。运算符的功能类似于 . 链式运算符,不同之处在于,在引用为空 (nill 或者 undefined)的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 un......
  • 矩阵的基本运算
    题目:矩阵的基本运算1、矩阵创建2、矩阵相加3、矩阵相减4、矩阵相乘5、数字乘矩阵6、矩阵上叠加7、矩阵左右叠加8、矩阵转置9、矩阵旋转10、矩阵求逆11、矩阵输出运用知识1.动态内存分配是一种在程序运行时动态地分配内存空间的机制。与静态内存分配相比,动态内存分配......
  • java中取余运算符
    Java中取余运算符在Java中,取余运算符(%)用于计算两个数相除之后的余数。它可以用于整数和浮点数类型的操作数,并且取余运算符的使用和结果与数学中的模运算相同。本文将详细介绍Java中取余运算符的用法,并给出一些示例代码来帮助理解。取余运算符的使用取余运算符用于计算两个数相除......
  • mysql加减运算
    MySQL加减运算实现步骤为了帮助刚入行的小白实现MySQL的加减运算,我将按照以下步骤来进行说明。首先,我们需要创建一个MySQL数据库,并在数据库中创建一个用于存储加减运算结果的表。然后,我们需要编写SQL语句来进行加减运算,并将结果存储到表中。最后,我们可以通过查询表的方式来验证加......
  • 矩阵的基本运算
    矩阵的基本运算1、矩阵创建2、矩阵相加3、矩阵相减4、矩阵相乘5、数字乘矩阵6、矩阵上叠加7、矩阵左右叠加8、矩阵转置9、矩阵旋转10、矩阵求逆11、矩阵输出主要运用的知识点:掌握二维指针的动态分配内存下面举一个简单的例子来理解二维指针的动态分配内存#include......