zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    字符编码相关
    函数之形参与实参
    文件操作模式
    函数对象,名称空间,作用域,和闭包
    吴裕雄天生自然SPRINGBOOT开发实战处理'spring.datasource.url' is not specified and no embedded datasource could be autoconfigured
    吴裕雄天生自然SPRINGBOOT开发实战处理XXXX that could not be found.
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot HTML表单登录
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot REST示例
    吴裕雄天生自然SpringBoot开发实战学习笔记处理 Could not write metadata for '/Servers'.metadata\.plugins\org.eclipse.core.resources\.projects\Servers\.markers.snap (系统找不到指定的路径。)
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot Tomcat部署
  • 原文地址:https://www.cnblogs.com/cpoint/p/3367382.html
Copyright © 2011-2022 走看看