zoukankan      html  css  js  c++  java
  • 位运算符&移位运算符

    位运算符

    按位操作符用来操作整数基本数据类型中的单个比特(bit),就是二进制,按位操作符会对两个参数中对应的位(bit)执行布尔运算,最终生成一个结果。下面我们来看一下都有哪些位运算符。
    这里写图片描述
    ok,有人看了之后可能会问,与、或、异或这三个符号不是逻辑运算符吗,怎么又成了位运算符?
    其实,我们知道,任何信息在计算机中都是以二进制的形式保存的,既然它们可以对布尔值进行运算,那么”&”、“|”、“^”除了可以作为逻辑运算符就也可以作为位运算符了。位运算是直接对二进制进行运算。他们对两个操作数中的每一个二进制位都进行运算。
    首先,我们先将规律罗列出来:

    可以把1当做true 0当做false
    只有参与运算的两位都为1,&运算的结果才为1,否则就为0。 
    只有参加运算的两位都是0,| 运算的结果才是0,否则都是1。
    只有参加运算的两位不同,^ 运算的结果才为1,否则就为0

    单单这么看,大家可能还不知道怎么回事,我们来举几个例子。
    1.& 与运算
    这里写图片描述
    这样是不是就很清晰了呢?

    2.| 或运算
    这里写图片描述

    3.^ 异或运算
    这里写图片描述

    4.取反操作
    其实,表面上看起来,取反操作是一个比较难理解的操作。但实际上,取反操作还是相对简单的。
    我们有一个清晰的思路,那就是将一个十进制数表示为二进制数,然后对其取反,也就是将二进制数的1变成0,0变成1。
    但是,我们面对这个问题,出现的情况是多种的,这个思路还不足以满足要求,让我们来看看具体的操作流程。
    流程如下:

    1.先将这个数的原码写出来,如果是正数,则二进制数最高位写0,负数则是1
    2.求出这个二进制数的补码,正数的补码是其本身,负数的补码计算方法是:最高位数值不变,其余位求反,再按照正常的加法操作加1。
    3.对补码进行求反
    4.求反后的补码按照正常的减法操作减1(注意二进制是满二进一)
    5.对除去当前二进制数最高位的其余位数进行求反
    6.求出最终的值,最高位代表的是当前数字的正(0)负(1)号

    这个操作方法亲测可用,这只是其中的一个方法,大家可以搜索一下其他的方法。

    移位操作符

    << 左移、>> 右移、>>> 无符号右移
    移位操作符有如上几种。
    对于这部分,我不做过多的解释,用几个图来表示一下就可以了。

    1.<<左移
    栗子:6<<2
    这里写图片描述
    也就是说,左移符号左边是操作数,右边是移动的位数,左移动的两位数丢弃,空余出来的右侧用0来补充,所以,左移位数越多,数字是越大的。

    2.>>右移
    栗子:6>>2
    这里写图片描述
    右移操作符有两种情况,当操作数的最高位是1时,空余位补1,是0时补0。

    3.>>>无符号右移
    无符号右移的情况和右移类似,只是,这种移动方法,无论操作数二进制数最高位是0还是1,空余位都补0。

    结语

    感谢您的阅读,欢迎指正博客中存在的问题,也可以跟我联系,一起进步,一起交流!

    微信公众号:进击的程序狗
    邮箱:roobtyan@aliyun.com
    个人博客:https://roobtyan.github.io

  • 相关阅读:
    Project Euler Problem 26-Reciprocal cycles
    Project Euler Problem 24-Lexicographic permutations
    Project Euler Problem 23-Non-abundant sums
    AtCoder Beginner Contest 077 D Small Multiple(最短路)
    浮点数表示及其实现
    ACM water
    Makefile经典教程(掌握这些足够)
    Linux makefile 教程 非常详细,且易懂
    C/C++中const的用法 分类: C/C++ 2015-07-05 00:43 85人阅读 评论(0) 收藏
    自动化测试工具QTP的使用实例 分类: 软件测试 2015-06-17 00:23 185人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/roobtyan/p/9576742.html
Copyright © 2011-2022 走看看