zoukankan      html  css  js  c++  java
  • Java位运算总结

    java中的位运算,涉及到计算机二进制,位用bit表示,1 byte=8bit,根据各种基本数据类型占用的字节空间,可以计算各种数据有多少位二进制,可以算出对应的取值范围。
    
    4种位运算基本符号:与(&)运算,或(|)运算,异或(^)运算,非(~)运算,左移运算(<<),右移运算(>>),无符号右移运算(>>>),注意没有无符号左移运算.
        
    (1). 与运算符&(and)
    与运算,两个数值进行与运算时,转换成二进制数据,两个数值中进行比对,位都为1,结果数值对应的位才为1,否则对应的位为0;
    例如:5 & 6运算
    十进制5对应的二进制为101
    十进制6对应的二进制为110
    运算结果为:100(二进制),则对应的十进制就是4;
    
    (2).或运算符 |(or)
    或运算,两个数值进行比对,只要有一个数值对应的位是1,则结果数值对应的位就为1,否则对应的位为0;
    例如:5 | 6运算
    十进制5对应的二进制为101
    十进制6对应的二进制为110
    与运算结果为:111(二进制),对应的十进制为7;
    
    (3).异或运算符 ^(xor)
    异或运算,两个数值进行比对,两个数值中,相同的位都为0或者都为1(即相同位值相同),则结果数值中对应的位则为0,不同,则结果数值中对应的位就为1;
    例如:5 ^6运算
    十进制5对应的二进制为101
    十进制6对应的二进制为110
    异或运算之后的结果为:011,对应的十进制为3;
    (注意:这里的^符号与我们平时用来做乘幂的^不同,java中不用^来做乘幂运算,java中做乘幂运算有数学函数Math.pow(x,a)来负责,表示x的a次方)
    
    (4).非运算符 ~(not)
    非运算是针对单个数值来运算,数值转换成二进制后,对应的位是0,则结果数值中对应的位是1,如果位是1,则对应的结果的位是0
    例如:~5
    十进制5对应的二进制为0000 0000 0000 0000 0000 0000 0000 0101
    非运算后结果为:     1111 1111 1111 1111 1111 1111 1111 1010 ,对应的十进制为-6
    
    移位运算
    (1).左移运算
    左移运算符,表示将二进制数据向左移动相应的位数(在低位处补上相应位数的0)
    十进制19对应的二进制为10011,左移3位,原本5位的二进制,变为8位,多出的三位在低位,补0,结果为10011000,十进制数值为152,左移运算相当于原来的数值乘以2的位移位数次幂,如本例结果为19*2*2*2=152;
    
    (2).有符号右移运算
    右移运算符,区别于“无符号”右移运算符,将运算符左边的十进制数值转换为二进制,然后整体向右移动运算符右边指定数的位数,使用符号拓展机制,如果值是正,则在高位补上0,反之为负,则在高位补上1
    十进制19对应的二进制为10011,右移3位,原本5位的二进制,变为2位(低位3位被挤掉),高位补三位,补0,结果为00010,十进制数值为2
    当十进制取值为负数时,例如取值-19,则结果不同-19对应的二进制为
    {补充负数二进制的获取方法:首先用-19的相反数19取二进制为10011,19的二进制10011为原码(一个整数按照绝对值大小转换成的二进制数,是为原码。32位,前面是0省略掉了0000 0000 0000 0000 0000 0000 0001 0011),然后取反(0的变成1,1的变成0。),得到反码1111 1111 1111 1111 1111 1111 1110 1100,反码再加1为1111 1111 1111 1111 1111 1111 1110 1101得到的是补码,则-19表示为二进制就是1111 1111 1111 1111 1111 1111 1110 1101,-19右移3位,高位补1,二进制为1111 1111 1111 1111 1111 1111 1111 1101),对应十进制为-3;
    
    (3).分析无符号右移运算
    “无符号”右移运算符,将运算符左边的十进制数值转为二进制后运算,二进制数据整体右移指定的位数,采用0扩展机制无论值为正负,都在高位补0
    19>>>3,对应的十进制结果也是2
    -19>>>3,-19对应的二进制为1111 1111 1111 1111 1111 1111 1110 1101,-19右移3位,高位补0,则为0001 1111 1111 1111 1111 1111 1111 1101,对应的十进制为536870909;
    
    
    位运算技巧:
    1.乘以2的m次方:n << m
    2.除以2的m次方:n >> m
    3.判断奇偶数 :(n & 1) == 1 // true 奇数   false 偶数
    4.快速幂算法求n的m次方
        public static int power(int n, int m) {
            int temp = 1, base = n;
            while (m != 0)  {
                if ((m & 1) == 1) {  // 判断奇偶,
                    temp = temp * base;
                }
                base = base * base;
                m >>= 1;   // 舍弃尾部位
            }
            return temp;
        }
    
  • 相关阅读:
    php 数组分页
    Fchart
    thinkphp对数据库操作有哪些内置函数
    MySQL性能优化的最佳20+条经验
    apache 简单笔记
    PHPMyadmin 配置文件详解(配置)
    mysql 常用知识
    分布式微服务日志的配置
    分布式微服务的配置
    分布式接口的调用
  • 原文地址:https://www.cnblogs.com/shiji-note/p/14559851.html
Copyright © 2011-2022 走看看