一 源码、反码、补码

正数的源码、反码、补码相同,例如5:

           5的源码:101

           5的反码:101

           5的补码:101

负数的源码、反码、补码不同,例如-5:

           -5的源码:10000101

           -5的反码:111111010 (取反操作)

           -5的补码:111111011 (补码加1操作)

计算机所有数据都以补码存储和运算。

二 位操作

      位操作包含&,|,!分别表示与,或非。

    eg:

               5 & 4 = 101 & 100 = 100(按位取“与”,1 & 1 = 1,0 & 1 = 0)

               5 | 4 = 101 | 100 = 101  (按位取“或”,1 | 0 = 1, 0 | 0 = 0)

                    !5    = ! 101 = 010  (按位取“反”,!1  = 0, !0  = 1)

三 位运算实例

          eg:给定一个有符号整数X(32位),写一个方法,检查这个数是否是4的N次方,N是非负整数。

下面是用Java解答这道题:

public class Test {
    public static void main(String[] args) {
        for(int i = -64; i < 400; i+=1) {
            if(isPowerOfFour5(i))
            System.out.println("test "+ i + " is power of four!");
        }
    }

    public static boolean isPowerOfFour1(int x) {
        if(x == 0) return false;
        while ((x % 4) == 0) {
            x /= 4;
        }
        return x == 1;
    }
   
    public static boolean isPowerOfFour2(int x) {
        if(x == 0) return false;
        while ((x % 4) == 0) {
            x >>= 2;
        }
        return x == 1;
    }
   
    public static boolean isPowerOfFour3(int x) {
         double n = Math.log(x) / Math.log(4);
         if(n -(int)n != 0) return false;
         return n >= 0;
    }
   
    public static boolean isPowerOfFour4(int x) {
        if(x == 0) return false;
       int y = (int) Math.sqrt(x);
        if(y * y == x)
            return ((y & (y-1)) == 0);
        return false;
    }
   
    public static boolean isPowerOfFour5(int x) {
        if(x == 0) return false;
        return (x & (x - 1)) == 0 && (x & 0xAAAAAAAA) == 0;
    }
}

稍微解释一下,第一个方法的算法复杂度是log4X,原理是,凡是4的N次方的数(N是大于等于0的正整数),则对X一直取余,最终结果肯定等于1,比如4 * 4 * 4 = 64。

第二个方法和第一个方法原理一样,>>2相当于/4。

第三个方法利用公式:4N = X  => N = log4X = logX / log4,所以只需要判断N大于等于0且为整数即可(如果n-(int)n != 0表明n不是整数)。

第四个方法的原理如下:

40     41   42    43   …  4n

(22)0 (22)1 (22)2 (22)3 … (22)n

则y = Math.sqrt(x)等于:

20   21    22    23   …  2n

所以我们只需要判断y是整数,且y是2的n次方,n大于等于0且为整数:

判断一个整数y是不是2的n次方,只需要判断y&(y-1)等不等于0即可。

第五种方法的原理如下:

40                        1

41                   100

42              10000

43         1000000

 

4n     100000000…

可以发现,所有以4为底的N次方的数的2进制都只有1位为1,且为1的这一位在奇数位上。

因此,我们首先判断X的2进制只有一位,且该位不在偶数位上,还要注意0必须除外,因为0&任何数都等于0。

前面说过,x & (x - 1) == 0则表明x是2的n次方,我们应该知道任何2进制只有一位为1的数都可以表示为2的n次方。

既然已经确定x的2进制数只有一位为1,那么(x & 0xAAAAAAAA) == 0表明为1的这一位在奇数位上,因为0xAAAAAAAA = 1010 1010 1010 1010

 

Java位运算经典实例的更多相关文章

  1. Java位运算总结:位运算用途广泛《转》

    前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...

  2. Java位运算总结:位运算用途广泛

    前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...

  3. Java 位运算超全面总结

    1.原码.反码.补码 关于原码.反码.补码的相关知识作者不打算在这里长篇大论,相关知识已有别的大佬总结很好了,还请老铁自行 Google,不过有篇知乎回答是作者学编程以来见过对相关知识最通俗易懂,生动 ...

  4. Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range

    在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...

  5. 【位运算经典应用】 N皇后问题

    说到位运算的经典应用,不得不说N皇后问题. 学过程序设计的都知道N皇后问题,没听过也没关系.很简单,最传统的的N皇后问题是这个样子的,给你一个n * n大小的board,让你放n个皇后(国际象棋),要 ...

  6. Java位运算原理及使用讲解

    前言日常开发中位运算不是很常用,但是巧妙的使用位运算可以大量减少运行开销,优化算法.举个例子,翻转操作比较常见,比如初始值为1,操作一次变为0,再操作一次变为1.可能的做法是使用三木运算符,判断原始值 ...

  7. (转)java位运算

    转自:http://aijuans.iteye.com/blog/1850655 Java 位运算(移位.位与.或.异或.非)   public class Test { public static ...

  8. 我们必须要了解的Java位运算(不仅限于Java)

    本文原创地址为 https://www.cnblogs.com/zh94/p/16195373.html 原创声明:作者:陈咬金. 博客地址:https://www.cnblogs.com/zh94/ ...

  9. java位运算(操作)的使用

    位操作是程序设计中对位模式按位或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运算的运算速度通常与加法 ...

随机推荐

  1. Python爬虫库Scrapy入门1--爬取当当网商品数据

    1.关于scrapy库的介绍,可以查看其官方文档:http://scrapy-chs.readthedocs.io/zh_CN/latest/ 2.安装:pip install scrapy  注意这 ...

  2. SSL/TLS算法流程解析

    SSL/TLS 早已不是陌生的词汇,然而其原理及细则却不是太容易记住.本文将试图通过一些简单图示呈现其流程原理,希望读者有所收获. 一.相关版本 Version Source Description ...

  3. oracle 用户与表空间关系

    oracle用户与表空间关系用户=商家表=商品表空间=仓库1. 1个商家能有很多商品,1个商品只能属于一个商家2. 1个商品可以放到仓库A,也可以放到仓库B,但不能同时放入A和B3. 仓库不属于任何商 ...

  4. 打造完美的xml技术解决方案(dom4j/xstream)

    转: XML 技术是随着 Java 的发展而发展起来的.在 XML 出现之前对于简单的数据格式通常是存储在 ini 配置文件等文本文件中,复杂的格式则采用自定义的文件格式,因此对于每种文件格式都要有专 ...

  5. 关于分布式事务的一个误解:使用了TransactionScope就一定会开启分布式事务吗?

    背景: 事务是数据库管理系统的一个基本概念,事务具有四个基本特点,即ACID:原子性(Atomicity).一致性(Consistency).隔离性(Isolation)和持久性(Durability ...

  6. oracle 科普

    Schem定义 A schema is a collection of database objects (used by a user.). Schema objects are the logic ...

  7. winform里操作打开在panel里的form窗体,子窗体操作同级子窗体或者父窗体的方法

    最近开始了一个winform项目,原先一直都是web项目.遇到个问题,就是在框架内,左侧和中间的main都是用panel来实现的form,就是把form窗体打开到panel里,实现左侧是导航,中间是操 ...

  8. C#:优惠券代码

    static Random random = new Random(); List<string> generatedVouchers = new List<string>() ...

  9. IOCP和WSA异步协同客户端版

    有些小伙伴看了之前发的WIN平台下IOCP和WSA异步协同处理SOCKET后有些疑惑,所以就画了个简易流程图+架构图发上来给小伙伴参考 简单说,WSA异步控制CONNECT,IOCP控制WSASend ...

  10. C语言函数指针实验

    上次看Atmel的示例工程,发现人家使用了函数指针的结构体(函数指针结构体).感叹人家的C语言功夫审核,自己费劲还是只能读懂的份.不过,函数指针确实好用.今天就试试这个超牛的东西.Now let's ...