• 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

  • 相关阅读:
    王妃
    某个奇怪的引理 学习总结
    多项式求ln,求exp,开方,快速幂 学习总结
    第二类斯特林数 学习总结
    cojs QAQ的图论题 题解报告
    cojs QAQ的序列 解题报告
    QAQ OI生涯の最后一个月
    cojs 疯狂的字符串 题解报告
    【51Nod 1238】最小公倍数之和 V3
    【51Nod 1190】最小公倍数之和 V2
  • 原文地址:https://www.cnblogs.com/cpoint/p/3367382.html
Copyright © 2020-2023  润新知