逻辑运算

位运算:位操作是对整数或其他二进制表示的数据的每个位进行单独操作。

虽然早期的计算机仅对整字进行操作,但人们很快就发现,对字中由若干位组成的字段甚至对单个位进行操作是很有用的,如:

    1.位级操作:在计算机硬件和软件层面支持对一个字中的单个或一组位进行操作,这对于实现诸如错误检测(如奇偶校验、CRC校验)、数据压缩、编码解码(如ASCII到EBCDIC转换)、权限控制(如访问控制位)以及硬件接口信号处理等任务至关重要。

    2.布尔逻辑:逻辑门电路的设计和数字逻辑的应用也要求能够对位进行AND、OR、NOT等逻辑操作,这在计算机内部的控制电路中是基础性的工作。

    3.打包和拆包:在通信协议、数据格式化等领域,经常需要将多个小的数据元素(比如单个字符或标志位)组合成一个较大的字,或者从一个字中提取特定的位字段,这些操作都依赖于位级操作指令。
    
    因此,现代计算机的指令集架构中通常包含了丰富的位操作指令,允许程序员直接对数据的各个位进行操作,极大地增强了程序设计的灵活性和效率。

按位与(AND):同1为1
    作用:
        x & 1 = x  x & 0 = 0
        1.保留某些位
        2.清除某些位
        3.检查标志位
        4.网络地址和子网掩码计算
        5.硬件接口控制
        6.数据有效性校验

按位或(OR):有1为1
    作用:
        x | 0 = x   x | 1 = 1
        1.设置标志位
        2.合并数据
        3.条件赋值
        4.硬件接口控制

按位异或(XOR):不同为1
    注:
        1.满足交换律:a^b = b^a
        2.满足结合律:(a^b)^c = a^(b^c)
        3.自反性:a^a = 0
        a^0 = a
    作用:
        1.不改变原始数据进行翻转特定位
        2.交换两个变量的值(无需临时变量)
            x=x^y
            y=x^y
            x=x^y
        3.计算奇偶校验位

非/取反(NOT):单个操作数的每位取反,0变为1,1变为0。
    作用:
        1.反转二进制位
        2.计算数值的补码形式
            对一个正数执行按位非操作会得到一个负数,这个负数的补码是对其绝对值的原码按位取反后再加1;
            反之,对一个负数执行按位非操作,则大致上可以得到该负数加1之后对应的正数(但不是绝对准确,因为溢出问题可能导致不一致)。
        3.创建掩码
        4.判断奇偶性

左移(Left Shift):将一个数的所有位向左移动指定次数,空出的低位补零。
    作用:
        1.乘以2的幂
        2.设置标志位
        3.优化内存访问

右移(Right Shift):将一个数的所有位向右移动指定次数,高位是符号位时,可能补符号位(算术右移),也可能补0(逻辑右移)。
    作用:
        1.除以2的幂---->向下取整
        2.快速除法和乘法
        3.提取低阶位信息

字符表示 字符通常被组合为字符数目可变的字符串。表示一个字符串的方式有三种选择:

    1.长度前置:在字符串的第一个位置存储字符串的长度。这种方式允许直接通过第一个字节或几个字节快速获取字符串长度,不需要遍历整个字符串来计算长度。

    2.附加长度变量:在字符串数据之后额外存储一个变量(通常是整数类型),用来记录字符串的实际长度。

    3.使用特定字符作为结束符:如C语言中采用的方式,即在字符串的最后一个有效字符后面添加一个特殊的字符(通常是ASCII码值为0的空字符'\0')来标识字符串的结尾。