• C语言位操作初步


    位操作允许程序员对单独的位进行操作,例如,早某些机器上,短整型占16位,位操作将每一位单独操作。

    位操作允许程序员设置、清除、测试与其他的操作,这些操作如下表:

    操作 含义
    & 按位与
    | 按位或
    ^ 按位异或
    ~ 取反
    << 左移
    >> 右移

    这些操作用于整型或者字符型

    1、按位与(&)

    Bit1 Bit2 Bit1 & Bit2
    0 0 0
    0 1 0
    1 0 0
    1 1 1

    通常我们可把按位“与”操作 & 作为关闭某位(即将该位置0)的手段,例如我们想要关闭a数中的第3位,而又不影响其它位的现状,可以用一个数0xF7,即二进制数1111 0111去与a数作按位“与”运算:
        0x88 1000 1000 a数
     & 0xF7 1111 0111 屏蔽数
       =       1000 0000

    注意,这个数除第3位为0外,其它各位均为1,操作的结果只会将a数中的第3位置0,而a数的其它位不受影响。也就是说,若需要某个数的第n位关闭,只需要将该数与另一个数按位相与,另一个数除了相应的第n位为0外,其它各位都为1,以起到对其它各位的屏蔽作用。

    应用举例:判断一个数字的奇偶性

    由于在二进制下,当最后一个数字为0,则此数字为偶数,若为1则此数为奇数

    代码如下:

    int even(const int value)
    {
        return ((value & 1)==0);
    }


    2、按位或(|)

    Bit1 Bit2 Bit1 | Bit2
    0 0 0
    0 1 1
    1 0 1
    1 1 1

     通常我们可把按位“或”操作 | 作为置位(即将该位置1)的手段,例如我们想要将a数中的第0位和1位置1,而又不影响其它位的现状,可以用一个数0x03,即二进制数00000011去与a数作按位“或”运算:

      0x88 1000 1000 a数
    | 0x03 0000 0011 屏蔽数
       =     1000 1011

    注意,这个数除第0、1位为1外,其它各位均为0,操作的结果只会将a数中的第0、1位置1,而a数的其它位不受影响。也就是说,若需要某个数的第n位置1,只需要将该数与另一个数按位相“或”,另一个数除了相应的第n位为1外,其它各位都为0,以起到对其它各位的屏蔽作用

    3、按位异或(^)

    Bit1 Bit2 Bit1 ^ Bit2
    0 0 0
    0 1 1
    1 0 1
    1 1 0

    按位“异或”运算 ^ 具有一些特殊的应用,介绍如下:

    ① 按位“异或”运算可以使特定的位取反
    例如:我们想让a数中的最低位和最高位取反,只要用0x81,即二进制数10000001去与它作按位“异或”运算,其运算结果同上式。经过操作后,最高位的值已经由1变0,而最低位的值也已经由0变1,起到了使这两位翻转的效果。其它位的状态保持不变。
    可以看到,这个数除最低位、最高位为1外,其它各位均为0,操作的结果只会将a数中的第0、7位取反,而a数的其它位不受影响。也就是说,若需要某个数的第n位取反,只需要将该数与另一个数按位相“异或”,另一个数除了相应的第n位为1外,其它各位都为0,以起到对其它各位的屏蔽作用。上面的运算可以用a = a ^ (0x81) 来表示,也可以用a ^ =(0x81) 来表达。

    ② 直接交换两个变量的值
    例如,若有变量a = 3,b = 4,想要交换它们的值,可以做如下一组操作:
    a ^ = b
    b ^ = a
    a ^ = b

    首先,a ^ = b:
        a 0000 0011
     ^ b 0000 0100
    a =  0000 0111

    其次,b ^ = a:
        b 0000 0100
     ^ a 0000 0111
    b =  0000 0011

    最后,a ^ = b:
        a 0000 0111
     ^ b 0000 0011
    a =  0000 0100

    这样,a、b两个变量中的值就进行了对调。

     4、按位取非(~)

    Bit ~Bit
    0 1
    1 0

    5、左移操作(<<)与右移操作(>>)

    对于x,x<<n相当于x^n,x>>n相当于x/(2^n)

    6、右移操作详解:

    右移操作相当的诡异,当一个变量进行右移操作,C语言需要填充左边空的比特位

    然而对于有符号变量,C使用符号位,如下表:

      signed char signed char unsigned char
    表达式 9>>2 -8>>2 248>>2
    Binary Value>>2 0000 1010>>2 1111 1000>>2 1111 1000>>2
    结果 ??00 0010 ??11 1110 ??11 1110
    填充 Sign Bit(0) Sign Bit(1) 0
    最终结果(二进制) 0000 0010 1111 1110 0011 1110
    最终结果(短整型) 2 -2 62
  • 相关阅读:
    计算机控制技术课程动画课件资料等
    “工业4.0”下的可视化工厂建设方案
    UE4成批处理透明材质
    ROS_Kinetic_x 基於ROS和Gazebo的RoboCup中型組仿真系統(多機器人協作)
    UE4 C++与蓝图交互
    UE4联机烘焙
    临近毕业:AndroidVS大数据Java的offer,我到底应该怎么选?
    态度决定成败:大专毕业的我如何在25岁时拿到了阿里P6的offer?
    这13位专家关于kotlin的看法,80%移动开发人员都没听过
    Flutter 初学者到底需要怎样的Demo?
  • 原文地址:https://www.cnblogs.com/xueda120/p/3140510.html
Copyright © 2020-2023  润新知