zoukankan      html  css  js  c++  java
  • java 位操作的总结

    2014-05-07 17:14 今天工作上需要一个Byte的低5位,高3位。所以查询了资料。总结下如何实现

    百度到一个资料:

    介绍的很详细

     基础知识:

    http://www.blogjava.net/zhaomingchao/articles/298318.html

     位运算的应用:(非常全面的总结)

    http://blog.csdn.net/morewindows/article/details/7354571

    这里就写下代码,来实现他的实例。

    package cn.wuwenfu.bytedemo;
    
    public class ByteDemo {
    
        public static void main(String[] args) {
            
            //位操作只能用于整形数据,对float和double类型进行位操作会被编译器报错。
            //<< 各个处理器是不同处理的。尤其是有符号的 数  要注意。,有的补符号位(算术右移),有的补0(逻辑右移)
    
            // 二进制负数以它正值的补码形式表达
            System.out.println("整数5的二进制字符串:" + Integer.toBinaryString(5));
    
            System.out.println("整数5取反后的二进制字符串为:" + Integer.toBinaryString(~5));
    
            System.out.println("整数5取反 加 1的二进制字符串为:"
                    + Integer.toBinaryString(~5 + 1));
    
            System.out.println("负5的二进制字符串" + Integer.toBinaryString(-5));
            System.out.println("---------------------------------------");
            
            
            //java ~ 操作符,对每个二进制位的内容求反,即1变成0,0变成1
            
            System.out.println("整数5的二进制字符串:" + Integer.toBinaryString(5));
    
            System.out.println("整数5取反后的二进制字符串为:" + Integer.toBinaryString(~5));
            
            System.out.println("---------------------------------------");
            //java & 操作符,对应的二进制位进行与操作,两个都为1才为1,其他情况均为0
            
            System.out.println("整数5的二进制字符串:" + Integer.toBinaryString(5));
    
            System.out.println("整数4的二进制字符串为:" + Integer.toBinaryString(4));
            
            System.out.println("5&4的二进制字符串为:"+Integer.toBinaryString(4&5));
            
            System.out.println("---------------------------------------");
            
            //java | 操作符,对应的二进制位进行或操作,两个都为0才为0,其他情况均为1
            
            
            System.out.println("整数5的二进制字符串:" + Integer.toBinaryString(5));
    
            System.out.println("整数4的二进制字符串为:" + Integer.toBinaryString(4));
            
            System.out.println("5|4的二进制字符串为:"+Integer.toBinaryString(4|5));
            
            System.out.println("---------------------------------------");
            
            //java ^ 操作符 当对应二进制位值相同,该位为0 否则为1
            
            
            System.out.println("整数5的二进制字符串:" + Integer.toBinaryString(5));
    
            System.out.println("整数4的二进制字符串为:" + Integer.toBinaryString(4));
            
            System.out.println("5^4的二进制字符串为:"+Integer.toBinaryString(5^4));
            
            System.out.println("---------------------------------------");
            
            //java << 操作符,左边移动,右面填充0
            
            System.out.println("整数5的二进制字符串:" + Integer.toBinaryString(5));
    
        
            
            System.out.println("5<<4的二进制字符串为:"+Integer.toBinaryString(5<<4));
            
            System.out.println("---------------------------------------");
            
            
            //java >> 操作符,左边移动,右面填充0
            
                    System.out.println("整数5的二进制字符串:" + Integer.toBinaryString(5));
    
                
                    
                    System.out.println("5>>4的二进制字符串为:"+Integer.toBinaryString(5>>4));
                    
                    System.out.println("---------------------------------------");
            
            //应用的实例
                
                System.out.println(" 5 ×2 = "+5*2);
                System.out.println(" 5 <<1 = "+ (5<<1));
                System.out.println("---------------------------------------");
                
                //这里是将字节转为整数,不是很明白。只是发现计算的结果 192+64 =256 是一个字节的长度 
                System.out.println(" -64&0xFF = "+(-64&0xFF));
                System.out.println(" 0xFF ="+Integer.parseInt("FF",16));
                
                System.out.println("---------------------------------------");
                
                
                //比较数是否相等.0表示相等,其他值表示不相等
                
                System.out.println(" 1^1 比较是否相等 : "+(1^1));
                System.out.println(" 20 ^20 比较是否相等 : "+ (20 ^ 20));
                System.out.println("20 ^ 1 比较是否相等:"+(20^1));
                
                System.out.println("0x65 ^ 0x65 比较是否相等:"+(0x65^0x62));
                System.out.println("---------------------------------------");
                
                //判断奇偶
                for (int i = 0; i < 50; ++i){
                    
                    if((i&1) == 0){
                        System.out.println("发现的偶数:"+i);
                    }
                }
                
                System.out.println("---------------------------------------");
                //交换2个数,不使用临时变量
                int a =3;
                int b =4;
                
                if(a != b){
                    a ^= b;  
                    b ^= a;  
                    a ^= b; 
                }
                System.out.println("a ="+a);
                System.out.println("b = "+b);
                System.out.println("---------------------------------------");
                
                //变换符号
                //这里可能大家觉得没用,但是如果 a的符号我们不清楚,估计就有用了。
                System.out.println(" 7 变换符号后:"+ (~7+1));
                System.out.println(" -7 变换符号后:"+ (~-7+1));
                System.out.println("---------------------------------------");
                //计算绝对值
                System.out.println(" 7 的绝对值:"+ my_abs(7));
                System.out.println(" -7 的绝对值:"+ my_abs(-7));
                System.out.println("---------------------------------------");
                
                //  高低位交换
                
                System.out.println("34520的二进制字符串为:"+Integer.toBinaryString(34520));
                System.out.println("34520>>8的字符串:"+Integer.toBinaryString(34520>>8));
                
                System.out.println("34520<<8的字符串:"+Integer.toBinaryString(34520<<8));
                //交换 它的前 8 与后8 这里需要截取。否则超出16位。
                String str = Integer.toBinaryString( (34520>>8)|(34520<<8));
                System.out.println("34520的交换位置:"+str);
                System.out.println("34520的交换位置并只保留16位:"+str.substring(str.length()-16,str.length()).trim());
                System.out.println("---------------------------------------");
                //二进制逆序
                
                System.out.println("34520的二进制字符串为:"+Integer.toBinaryString(34520));
                a =34520;
                a = ((a & 0xAAAA) >> 1) | ((a & 0x5555) << 1);  
                a = ((a & 0xCCCC) >> 2) | ((a & 0x3333) << 2);  
                a = ((a & 0xF0F0) >> 4) | ((a & 0x0F0F) << 4);  
                a = ((a & 0xFF00) >> 8) | ((a & 0x00FF) << 8);  
                
                System.out.println("34520的二进制字符串逆序后为:"+Integer.toBinaryString(a));
                System.out.println("---------------------------------------");
                //计算二进制1的个数
                
                System.out.println("34520的二进制字符串为:"+Integer.toBinaryString(34520));
                a =34520;
                a = ((a & 0xAAAA) >> 1) + ((a & 0x5555) );  
                a = ((a & 0xCCCC) >> 2) + ((a & 0x3333) );  
                a = ((a & 0xF0F0) >> 4) + ((a & 0x0F0F) );  
                a = ((a & 0xFF00) >> 8) + ((a & 0x00FF) );  
                
                System.out.println("34520的二进制字符串中1的个数为:"+a);
                System.out.println("---------------------------------------");
                
                
                
                
                
                
                //查出单独的一个数字,只出现一次的数字
                int[] arr = {1, 347, 6, 9, 13, 65, 889, 712, 889, 347, 1, 9, 65, 13, 712};
                int lostNum = 0;
                for (int i = 0; i < 15; i++){
                    lostNum ^= arr[i];
                }
                System.out.println("缺失的数字为:"+lostNum);
                
                System.out.println("---------------------------------");
                
                //指定整数的某一个位位0还是1
                //这里是制定第二位为1
                int j =34520;
                System.out.println("34520 的二进制位:"+Integer.toBinaryString(j));
                System.out.println("34520的第二位放1: "+Integer.toBinaryString(j|1<<1));
                
                System.out.println("---------------------------------");
                
                //判断某个整数 制定的位上 是 0还是1
                //这里查看的是第二位
                //原理是:1的二进制位00000001
                //1<<1变成了 00010;
                //再取与, 只有都为1时才1;其他的均为0; 
                //因此j的第二位 为 0 时 则 结果为 0 
                if((j&(1<<1)) !=0){
                    System.out.println("指定位上为1");
                }else{
                    System.out.println("指定位为0");
                }
                
                
                //利用的 是 & 的效果
                //取某个数的指定的几位
                System.out.println("34520 的二进制位:"+Integer.toBinaryString(34520));
                //直接与0xFF :11111111
                System.out.println("34520的低八位:"+Integer.toBinaryString(34520&0xFF));
                //直接与 0xFF00 :1111111100000000 
                System.out.println("34520的高八位:"+Integer.toBinaryString((34520&0xFF00) >>8));
                
                //3位
                //直接与0x1F :11111
                System.out.println("34520的低5位:"+Integer.toBinaryString(34520&0xFF));
                //直接与 0xE000 :1110000000000000 
                System.out.println("34520的高3位:"+Integer.toBinaryString((34520&0xE000) >>13));
    
    
        }
        
        //求绝对值得方法
        private static int my_abs(int a){
            int i = a>>31;
                //return i==0? a:(~a+1);
                return (a^i)-i;
            
        }
    
    }
    位操作实例

    其实位操作,平时用的很少,主要是不知道有什么用。

    网上查了下资料,使用位操作的好处:

    速度超快,这些都是底层的二进制机器操作指令。 

    实际的使用例子:

    1、如  a*2  ,我们可以用  a<<1 来代替。 依次可以推出   a ×4  ,可以用  a<<2

    2、通过 & 可以把字节转换为整 数,-64&0xFF=192  这里的 0xFF 是字节的十六进制表示。

    3、 通过 ^ 可以比较两个数字是否相等,它利用 1^1=0,0^0=0的原理。  20^20==0

    4、其他的应用在代码中

    截图如下:

    QQ:540045865 热爱生活,热爱编程。
  • 相关阅读:
    Jquery 图片预览插件 imgPreview
    对request.getSession(false)的理解(附程序员常疏忽的一个漏洞)
    JavaScript拖拽实现(附注释),最经典!最简单!短小精悍!
    如何使用VC++写一个小程序来检测.NetFrameWork版本
    利用TreeView实现C#工具箱效果
    JavaScript中json对象和string对象之间的转化
    Ubuntu Server上搭建可用于生产环境的ASP.NET服务器
    winexec()函数的参数说明(c++)
    C#对文件夹的判断、创建、移动、删除
    C#程序不用安装.NET环境运行(让C#程序脱离.net框架)
  • 原文地址:https://www.cnblogs.com/jsRunner/p/3714206.html
Copyright © 2011-2022 走看看