java中的位操作

之前做项目的时候使用位操作不是很多,今天在刷leetcode上题目的时候用到了位操作,是leetcode中的第29题Divide Two Integers

一、java的位操作:

位运算表达式由操作数和位运算符组成,实现对整数类型的二进制数进行位运算。位运算符可以分为逻辑运算符(包括~、&、|和^)及移位运算符(包括>>、<<和>>>)。

1)左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。左移一位(在不溢出的情况下)相当于乘以2。

2)“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。 “有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。右移一位相当于除以2。

3)Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0。

4)若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。 只有右侧的5个低位才会用到。这样可防止我们在一个int数里移动不切实际的位数。 若对一个long值进行处理,最后得到的结果也是long。在leetcode这道题目里面需要用到的类型是long。

5)在这6种操作符,只有~取反是单目操作符,其它5种都是双目操作符。

二、java位操作的实际操作:

我们从其他博客里面看到的位操作的举例往往都是给一个数字,然后通过syso进行输出操作。

程序:
public class PlusRightMoving{
    public static void main(String[] args){
           System.out.println("5>>1="+(5>>1));
    }
}
输出结果:
5>>1=2

但是需要注意的是,如果进行赋值操作和C/C++中是不一样的。

在C/C++中进行左移和右移操作:

div << 1;
res << 1;

但是在java中进行位移操作需要配合赋值操作:

long div = 1;
long res = 1;
while(div < dived){
    div = div << 1;
    res = res << 1;
}
    if(div != dived){
    div = div >> 1;
    res = res >> 1;
}

如果只是像C/C++中进行操作一样,会不能编译通过。

三、位操作的一些应用题:

1)判断奇偶

只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数。下面程序将输出0到100之间的所有偶数。

2)交换两数

int c = 1, d = 2; 
c ^= d; 
d ^= c; 
c ^= d; 
System.out.println(“c=” + c); 
System.out.println(“d=” + d);

3)变换符号

如对于-11和11,可以通过下面的变换方法将-11变成11

1111 0101(二进制) –取反-> 0000 1010(二进制) –加1-> 0000 1011(二进制)

同样可以这样的将11变成-11

0000 1011(二进制) –取反-> 0000 0100(二进制) –加1-> 1111 0101(二进制)

其他的应用可以参考博客文章:

http://blog.csdn.net/wfzczangpeng/article/details/51819471

其中有很多对java位操作的应用介绍。

时间: 2024-10-23 03:44:23

java中的位操作的相关文章

java中的位操作、移位操作

在日常开发中,其实位操作.移位操作的使用并不多,主要是其可读性较差,但是在计算密集型操作如一致性哈希计算.hashmap扩容.取数据的交集.差集.并集.权限开关位,位操作.移位操作被广泛使用.因此本文章来介绍Java中的位操作.移位操作,当然LZ特别说明我们的使用场景. 一. 相关基础概念 在开始java位运算的知识之前,我们先来了解几个基础的概念,机器数,真值,原码,反码,补码. 1.机器数 我们知道无论是代码还是数值,在计算机中最后都转换成以二进制的形式存在的,而一个数值在计算机中的二进制表

Java中的按位操作——Java编程思想笔记

欢迎转载,转载请务必注明出处:http://blog.csdn.net/alading2009/article/details/40450421 Java中的按位操作符有四个,分别是:&(按位与).|(按位或).^(按位异或).~(按位非). 1.先来看按位与(&) public class Main { public static void main(String[] args) { //按位与,两1得1,遇0得0 System.out.println(Integer.toBinaryS

Java中的引用和指针

java中内存的分配方式有两种,一种是在堆中分配,一种是在堆栈中分配,所有new出来的对象都是在堆中分配的,函数中参数的传递是在栈中分配的.通常情况下堆的内存可以很大,比如32位操作系统中的虚拟内存都可以被堆所使用(当内存紧张的时候甚至硬盘都可以是堆的存储空间),而堆栈的内存分配是有限的. 这和c++中内存分配差不多.java中有几种基本类型如int,float,double,char,byte等,他们不是对象,除此之外一切都是对象,所有的对象都是在堆上分配的.但好像在C#中这些都有封装好的一些

java中传值及引伸深度克隆的思考(说白了Java只能传递对象指针)

java中传值及引伸深度克隆的思考 大家都知道java中没有指针.难道java真的没有指针吗?句柄是什么?变量地址在哪里?没有地址的话简直不可想象! java中内存的分配方式有两种,一种是在堆中分配,一种是在堆栈中分配,所有new出来的对象都是在堆中分配的,函数中参数的传递是在栈中分配的.通常情况下堆的内存可以很大,比如32位操作系统中的虚拟内存都可以被堆所使用(当内存紧张的时候甚至硬盘都可以是堆的存储空间),而堆栈的内存分配是有限的. 这和c++中内存分配差不多(c++中还要有另一种方式用于全

Java中&amp;&amp;和&amp;的区别

Java中&&和&都是表示与的逻辑运算符,都表示逻辑运输符and,当两边的表达式都为true的时候,整个运算结果才为true,否则为false. &&的短路功能,当第一个表达式的值为false的时候,则不再计算第二个表达式:&则两个表达式都执行. &可以用作位运算符,当&两边的表达式不是Boolean类型的时候,&表示按位操作. &&第一个表达式为false int i = 0; if(i == 3 &&

深入理解Java中的HashMap

HashMap继承自抽象类AbstractMap,抽象类AbstractMap实现了Map接口.关系图如下所示: import java.util.*; public class SimpleMap<K,V> extends AbstractMap<K,V> { //keys存储所有的键 private List<K> keys = new ArrayList<K>(); //values存储所有的值 private List<V> values

java中int与byte数组互转代码详细分析

转载请注明出处:http://blog.csdn.net/tang9140/article/details/43404385 在java中,可能会遇到将int转成byte[]数组,或者将byte[]数组转成int的情况.下面我们来思考下怎么实现? 首先,分析int在java内存中的存储格式. 众所周知,int类型在内存中占4个字节,采用补码方式存储(假如对原码.反码.补码不熟悉,请查阅相关资料).举例: 整型-128对应内存中的二进制值为 整型128对应内存中的二进制值为 然后,考虑如何把int

深入理解Java中的HashMap的实现原理

HashMap继承自抽象类AbstractMap,抽象类AbstractMap实现了Map接口.关系图例如以下所看到的: Java中的Map<key, value>接口同意我们将一个对象作为key.也就是能够用一个对象作为key去查找还有一个对象. 在我们探讨HashMap的实现原理之前,我们先自己实现了一个SimpleMap类,该类继承自AbstractMap类. 详细实现例如以下: import java.util.*; public class SimpleMap<K,V>

Java中的二进制及基本的位运算

Java中的二进制及基本的位运算 二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一",借位规则是"借一当二",由18世纪德国数理哲学大师莱布尼兹发现.当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的.计算机中的二进制则是一个非常微小的开关,用"开"来表示1,"关"来表示0. 那么Java中的二进制又是怎么样的呢?让我们一起来揭开它神