首页 > 其他分享 >位运算符-按位取反运算符补充详解

位运算符-按位取反运算符补充详解

时间:2024-08-22 12:51:35浏览次数:10  
标签:二进制 取反 整数 运算符 num 按位

位运算符在计算机中用于直接操作整数的二进制位的运算符。这些运算符通常用于低级编程和优化特定类型的计算任务。

以下是几种常见的位运算符及其解释:

  1. 按位与(&)

    • 对应位都是1时结果为1,否则为0。
    • 例如:0101 & 0111 = 0101
  2. 按位或(|)

    • 只要对应位有一个是1,结果就为1。
    • 例如:0101 | 0111 = 0111
  3. 按位异或(^)

    • 当对应位不同,则结果为1;相同则结果为0。
    • 例如:0101 ^ 0111 = 0010
  4. 按位取反(~)

    • 将每个位上的0变为1,1变为0。
    • 例如:~0101 = 1010 (注意,在有符号整数中,这会受到补码表示的影响)
  5. 左移(<<)

    • 将二进制位向左移动指定的位数,右边空出的位置用0填充。
    • 例如:0010 << 1 = 0100
  6. 右移(>>)

    • 将二进制位向右移动指定的位数,左边空出的位置对于无符号数用0填充,对于有符号数则用最高位(符号位)的值填充。
    • 例如:0100 >> 1 = 0010

位运算符常用于处理二进制数据、进行快速数学运算、设置或清除标志等场景。

补充-按位取反运算符

按位取反运算符(通常表示为 ~)是一种位运算符,它用于对一个整数的每一位进行取反操作。具体来说,按位取反会将二进制表示中的每一个1变成0,每一个0变成1。

按位取反运算符的特点:

  1. 操作对象:按位取反只针对一个操作数进行操作。
  2. 操作过程:对于给定的操作数的每一位,如果是1,则变为0;如果是0,则变为1。
  3. 符号位的影响:在有符号整数中,按位取反会影响符号位。这意味着正数经过按位取反后会变成负数,而负数经过按位取反后会变成正数(但不是简单的取相反数)。

示例说明:

假设我们有一个8位的有符号整数 x 的值为 5,它的二进制形式为 00000101。那么按位取反后的结果将是 11111010

  • 原始值00000101 (十进制为5)
  • 按位取反后11111010

需要注意的是,在有符号整数中,二进制数通常采用补码表示法。因此,取反的结果还需要加上1才能得到真正的负数。例如,11111010 实际上代表的是 -6 而不是 -5,因为根据补码规则,11111010 表示的十进制数值为 -6

实际应用:

  • 位标志管理:可以用来反转某个位的状态。
  • 生成掩码:有时候需要生成一个全1或者全0的掩码,按位取反可以用来辅助生成这样的掩码。
  • 数值操作:在某些算法中,通过按位取反可以实现数值的特殊转换或运算。

注意事项:

  • 在处理有符号整数时,要注意按位取反后数值的实际意义,特别是当涉及到正负数转换时。
  • 在使用按位取反时要确保理解其对特定数据类型(如32位或64位整数)的影响。
  • 示例 1: 对整数进行按位取反

    这个例子展示了如何对一个整数执行按位取反操作。

     

    python

    深色版本

    1# 定义一个整数
    2num = 5  # 二进制表示为 00000101
    3
    4# 使用按位取反运算符
    5inverted_num = ~num
    6
    7# 输出结果
    8print("Original number:", num, "(binary:", bin(num), ")")
    9print("Inverted number:", inverted_num, "(binary:", bin(inverted_num), ")")

    示例 2: 显示按位取反的二进制表示

    这个例子显示了按位取反前后整数的二进制表示。

     

    python

    深色版本

    1# 定义一个整数
    2num = 5  # 二进制表示为 00000101
    3
    4# 使用按位取反运算符
    5inverted_num = ~num
    6
    7# 输出结果
    8print("Original number:", num, "(binary:", bin(num), ")")
    9print("Inverted number:", inverted_num, "(binary:", bin(inverted_num), ")")
    10
    11# 打印出完整的二进制表示
    12binary_num = format(num, '08b')
    13binary_inverted_num = format(inverted_num & 0xFF, '08b')  # 只显示最后8位
    14print("Binary representation of original number:", binary_num)
    15print("Binary representation of inverted number:", binary_inverted_num)

    示例 3: 使用按位取反进行位标志管理

    这个例子展示了如何使用按位取反来管理一个位标志。

     

    python

    深色版本

    1# 定义一个位标志
    2flag = 0  # 二进制表示为 00000000
    3
    4# 定义一个掩码
    5mask = 1 << 2  # 设置第3位为1,其余为0,即 00000100
    6
    7# 使用按位取反来反转位标志中的特定位
    8flag ^= mask
    9
    10# 输出结果
    11print("Original flag:", flag, "(binary:", bin(flag), ")")
    12print("Flag after using XOR and NOT:", flag, "(binary:", bin(flag), ")")

    示例 4: 使用按位取反生成掩码

    这个例子演示了如何使用按位取反生成一个掩码。

     

    python

    深色版本

    1# 定义一个整数
    2num = 5  # 二进制表示为 00000101
    3
    4# 获取整数的位数
    5num_bits = num.bit_length()
    6
    7# 生成一个所有位都为1的掩码
    8all_ones_mask = (1 << num_bits) - 1
    9
    10# 使用按位取反生成一个所有位都为0的掩码
    11all_zeros_mask = ~all_ones_mask
    12
    13# 输出结果
    14print("All ones mask:", all_ones_mask, "(binary:", bin(all_ones_mask), ")")
    15print("All zeros mask:", all_zeros_mask, "(binary:", bin(all_zeros_mask), ")")

    请注意,在这些示例中,Python 的 bin() 函数用于将整数转换成二进制字符串,以便直观地看到按位取反的效果。同时,& 0xFF 是用来截取最后8位的,因为在 Python 中,负数是以补码的形式存储的,这可能会导致输出中出现额外的高位1。

标签:二进制,取反,整数,运算符,num,按位
From: https://blog.csdn.net/2301_81985098/article/details/141409517

相关文章

  • C++学习,运算符
    运算符是告诉编译器执行特定数学或逻辑函数的符号。C++语言内置运算符丰富,提供以下类型的运算符:算术运算符关系运算符逻辑运算符按位运算符赋值运算符其它运算符 算术运算符(ArithmeticOperators)下表显示了C++语言支持的所有算术运算符。假设变量A=10,变量B=20:操作......
  • 再见了Try-Catch,ECMA增加安全赋值运算符提案
    JavaScript的错误处理即将获得重大升级。新的ECMAScript安全赋值运算符提案(?=)旨在通过减少对传统try-catch代码块的需求,来简化您的代码。让我们一起来看看这个提案如何简化您的错误管理,并使您的JavaScript代码更干净、更高效。简单示例传统的try-catch代码块常常导致代......
  • C++运算符优先级
    优先级操作符描述例子结合性1()[]->.::++--调节优先级的括号操作符数组下标访问操作符通过指向对象的指针访问成员的操作符通过对象本身访问成员的操作符作用域操作符后置自增操作符后置自减操作符(a+b)/4;array[4]=2;ptr->age=34;obj.age=34;Class::ag......
  • Swift中的强大构建块:自定义运算符全解析
    标题:Swift中的强大构建块:自定义运算符全解析在Swift编程语言中,运算符是执行操作的一种快捷方式,它们可以用于简单的数学计算,也可以用于复杂的逻辑处理。Swift不仅提供了丰富的内置运算符,还允许开发者定义自己的运算符,以适应特定的编程需求。本文将深入探讨如何在Swift中实现......
  • SHELL运算符
    Shell基本运算符Shell和其他编程语言一样,支持多种运算符,包括:算数运算符关系运算符布尔运算符字符串运算符文件测试运算符原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr,expr最常用。expr是一款表达式计算工具,使用它能完成表达式的求值操......
  • 逻辑运算符
    逻辑运算符&&||!packageoperator;/***@version:javaversion1.8*@Author:MrTheroux*@description:*@date:2024-08-209:33*/publicclassDemo05{publicstaticvoidmain(String[]args){booleana=true;booleanb......
  • 【数据结构与算法第一章】编程基础:变量与数据类型、指针、结构体、数组与链表、程序结
    目录【数据结构与算法第一章】编程基础1.1变量与数据类型1.2指针1.3结构体1.4数组和链表1.5程序结构1.6函数中参数的传递1.7C语言中运算符的含义【数据结构与算法第一章】编程基础1.1变量与数据类型变量:    ①在C语言中,所有变量必须先声明后使用......
  • C++运算符重载
    文章目录一、运算符重载1、规定2、operator关键词的使用二、赋值运算符的重载1、功能2、使用一、运算符重载1、规定C++允许我们对类类型使用运算符,但要我们自己通过运算符重载完成类类型的运算,如果没有对应的运算符重载就会报错。运算符重载需要使用特殊关键词......
  • Oracle运算符:从等号到空值运算的使用技巧
    在Oracle数据库中,关系运算符和逻辑运算符用于在SQL查询中定义条件。1.等号(=)运算符作用:用于精确匹配字段的值。适用场景:适用于比较数值、字符串、日期等数据类型,要求条件严格相等。例子:SELECTename,salFROMempWHEREdeptno=10;查询部门编号为10的所有员工姓名和......
  • 基本运算符
    基本运算符packageoperator;/***@version:javaversion1.8*@Author:MrTheroux*@description:*@date:2024-08-1917:06*/publicclassDemo01{publicstaticvoidmain(String[]args){inta=10;intb=20;intc=......