zoukankan      html  css  js  c++  java
  • 二进制操作, ~按位取反, | 或, & 与, ^异或, >倍数

    1.按位与:

    两个位都为1时,结果才为1

    &1 判断奇偶。

    eg1:

    xxx&1 === 1,xxx为奇数;xxx&1 ===0,xxx为偶数。

    也可以用取模的方式 xxx%2 ===1 奇数, xxx%2 === 0 偶数

    1的末位是1,其余是0 ,只有奇数&1才为1。

    eg2:

    xxx为1, xxx & (xxx-1) === 0

    &是只有都为1 才为1,否则为0。所以都是0。

    0&-1  2&1   4&3   6&5 =>4 => 所以说偶数 & (偶数-1)不一定为0,奇数 & (奇数-1)也不为0.

    2.按位取反:

    ~[1,2,3].indexOf(1)

    判断是否在这个数组中,在数组中。返回-1,-2,-3...。没在数组中返回0。

    所有正整数的按位取反是其本身+1的负数

    所有负整数的按位取反是其本身+1的绝对值

    零的按位取反是 -1

    二进制数在内存中是以补码的形式存放的。

    另外正数和负数的补码不一样,正数的补码、反码都是其本身,既:

    正数9:

    原码为: 0000 1001

    补码为: 0000 1001

    反码为: 0000 1001

    再例如: -2 

    求原码: 1111 0010 (前面4个1表示符号位)

    求反码: 1111 1101 (符号位不变,其余各位求反)

    求补码: 1111 1110 (符号位不变,末位+1)

    所以-2在内存中存放为: 1111 1110

    假设要对正数9按位取反——> (~9),计算步骤如下,

    原码为 0000 1001,

    反码为 0000 1001,

    补码为 0000 1001,

    对其取反 1111 0110(符号位一起进行取反,这不是反码更加不是最终结果,只是补码的取反仅此而已)

    我们还需要把他转换成原码,因为是负数所以进行负数补码到原码的逆运算

    先减1得反码: 1111 0101

    取反得原码:1111 1010,(反码和原码是一个相对的概念,对反码取反就是原码。取反过程符号位是不变的哦)

    前面4个1是符号位,1是负数,既得十进制:-10

     3. 按位取 | :

    两个位都为0时,结果才为0

    小数取整

    eg: 

    5.1 | 0 => 5

    5.5 | 0 =>5

    5.9 | 0 =>5

     4. ~~ 两个连续的按位取反运算,取整:

    ~~5.1 => 5

    ~~5.5 =>5

    最后一个有趣的事实是:

    1. 所有正整数的按位取反是其本身+1的负数

    2. 所有负整数的按位取反是其本身+1的绝对值

    3. 零的按位取反是 -1(0在数学界既不是正数也不是负数)

    3. 扩大倍数

    1>>1 => 0 , 缩小2 = 2^1倍 

    2>>1 =>1,  缩小2 = 2^1倍 

    4>>2 =>1, 缩小4= 2^2倍 

    1<<1  => 2, 扩大2 = 2^1 倍

    1<<2 => 4,    扩大4 = 2^2 倍 

    参考连接:

    原文链接:https://blog.csdn.net/xiexievv/java/article/details/8124108

  • 相关阅读:
    Linux基操:软件安装的方式:解压缩安装
    Linux基操:linux命令失效解决方法
    Linux基操:软件安装的方式:rpm,&&环境变量配置
    Linux基操:进程管理
    Linux基操:磁盘管理,扩展文件挂载问题
    Linux基操(Centos7):用户管理
    Linux基操:文件内容查看方式&&软链接硬链接(拓展)
    Linux基操:目录相关命令
    多测师肖sir_高级金牌讲师__面试和答案归纳
    多测师肖sir__高级金牌讲师 ___python中len函数
  • 原文地址:https://www.cnblogs.com/zhangzs000/p/12952165.html
Copyright © 2011-2022 走看看