Java移位运算符及小技巧

合集下载

Java中的位运算及简单的算法应用介绍

Java中的位运算及简单的算法应用介绍

Java中的位运算及简单的算法应⽤介绍众所周知,计算机底层是⼆进制。

⽽java作为⼀门计算机编程语⾔,也对⼆进制的位运算提供了完整的⽀持。

在java中,int是32位的,也就是说可以⽤来实现32位的位运算。

⽅便起见,我们⼀般⽤16进制对它赋值,⽐如: 0011表⽰成16进制是 0x3, 110111表⽰成16进制是 0x37。

那么什么是位运算呢?位运算是将数据看做⼆进制,进⾏位级别的操作。

主要有移位运算和逻辑运算移位运算:左移:操作符为<<,向左移动,右边的低位补0,左边⾼位舍弃,将⼆进制看做整数,左移1位就相当于乘以2。

⽆符号右移:操作符为>>>,向右移动,右边的舍弃掉,左边补0。

有符号右移:操作符为>>,向右移动,右边的舍弃掉,左边补的值取决于原来最⾼位,原来是1就补1,原来是0就补0,将⼆进制看做整数,右移1位相当于除以2。

10进制转⼆进制的时候,因为⼆进制数⼀般分8位、 16位、32位以及64位表⽰⼀个⼗进制数,所以在转换过程中,最⾼位会补零。

在计算机中负数采⽤⼆进制的补码表⽰,10进制转为⼆进制得到的是源码,将源码按位取反得到的是反码,反码加1得到补码⼆进制的最⾼位是符号位,0表⽰正,1表⽰负。

例如:int a = 4; //100a = a >> 2; //001,System.out.println("4>>2运算的结果是 :" + a);//变为1a = 4; //100a = a << 3; //100000,System.out.println("4<<3运算的结果是 :" + a);//变为32System.out.println("16>>2运算的结果是 :" + ((16) >> 2));//变为4System.out.println("-16>>2运算的结果是 :" + ((-16) >> 2));//变为-4System.out.println("16>>>2运算的结果是 :" + ((16) >>> 2));//变为4System.out.println("-16>>>2运算的结果是 :" + ((-16) >>> 2));//变为⼤的整数,看是多少位的得到结果可见正数做>>>运算的时候和>>是⼀样的。

JAVA右移运算符》和》

JAVA右移运算符》和》

JAVA右移运算符》和》
java提供两种右移运算符,属于位运算符。

位运算符⽤来对⼆进制位进⾏操作。

>> :算术右移运算符,也称带符号右移。

⽤最⾼位填充移位后左侧的空位。

>>>:逻辑右移运算符,也称⽆符号右移。

只对位进⾏操作,⽤0填充左侧的空位。

表达式为:
r = e1 >> e2;
r = e1 >>> e2;
表⽰把数e1向右移动e2位。

运算规则:
>> :按⼆进制形式把所有的数字向右移动对应位数,低位移出(舍弃),⾼位的空位补符号位,即正数补零,负数补1。

符号位不变。

>>>:按⼆进制形式把所有的数字向右移动对应位数,低位移出(舍弃),⾼位的空位补零。

对于正数来说和带符号右移相同,对于负数来说不同。

按上⼀篇,-1在32位⼆进制中表⽰为:
11111111 11111111 11111111 11111111
-1>>1:按位右移,符号位不变,仍旧得到
11111111 11111111 11111111 11111111
因此值仍为-1
⽽-1>>>1的结果为 01111111 11111111 11111111 11111111。

Java中的位运算

Java中的位运算

Java中的位运算
作者:Habey00
Java中在进行位运算时必须要知道的一个前提:Java中的所有数都是有符号的(0表正,1表负)...java中所有数都以原码方式显示,在计算机中以补码方式进行运算。

原码,反码,补码间的相互转换:
对正数而言:原码,补码,反码都相同
对负数来说:补码是对原码符号位不变,其它位取反,而反码是在补码基础上加1
Java中位运算符:
1.算数左移:符号位不变,低位补0
2.算数左移:符号位不变,低位溢出,高位用符号位补上
3.逻辑右移:所有为都是低位溢出,高位补0
简而言是:算数左移实现有符号数的倍增,算数右移实现有符号数的倍减(最小减到0)
逻辑右左实现无符号数的倍增,逻辑右移实现无符号数的倍减(最小减到0)
Java中的二进制运算:
~(取反):所有为都按位取反(包括符号位)&(位与):两个都为1时为1
&&(逻辑与)
|(位或):有一个为1就为1
||(逻辑或)
^(位异或):相异为1。

java算术移位运算

java算术移位运算

java算术移位运算摘要:一、Java 算术移位运算的基本概念二、Java 算术移位运算的操作方法三、Java 算术移位运算的实例解析四、Java 算术移位运算的注意事项正文:一、Java 算术移位运算的基本概念在Java 中,算术移位运算是一种对整数进行位操作的方法,它可以将一个整数的二进制位向左或向右移动一定的位数,从而得到一个新的整数。

算术移位运算包括无符号右移、无符号左移和带符号右移三种操作。

二、Java 算术移位运算的操作方法1.无符号右移(>>):将一个整数的二进制位向右移动指定的位数,左边空出的位用0 填充。

例如,a = 5(二进制为0101),a >> 1(即右移1 位)后,a 的值变为2(二进制为0010)。

2.无符号左移(<<):将一个整数的二进制位向左移动指定的位数,右边空出的位用0 填充。

例如,a = 5(二进制为0101),a << 1(即左移1 位)后,a 的值变为10(二进制为1010)。

3.带符号右移(>>>):将一个整数的二进制位向右移动指定的位数,左边空出的位用符号位填充。

例如,a = -5(二进制为1011),a >>> 1(即右移1 位)后,a 的值变为-2(二进制为1110)。

三、Java 算术移位运算的实例解析下面通过一个具体的例子来解析Java 算术移位运算:```javapublic class ShiftOperation {public static void main(String[] args) {int a = 10;int b = -10;// 无符号右移int c1 = a >> 2; // 结果为2int d1 = b >> 2; // 结果为-3// 无符号左移int c2 = a << 2; // 结果为40int d2 = b << 2; // 结果为-40// 带符号右移int c3 = a >>> 2; // 结果为2int d3 = b >>> 2; // 结果为-3}}```四、Java 算术移位运算的注意事项在进行算术移位运算时,需要注意以下两点:1.移位操作的位数应为非负整数,否则会抛出`ArithmeticException`异常。

Java的位运算符详解整理得比较全

Java的位运算符详解整理得比较全

Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。

从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。

下面详细介绍每个位运算符。

1.与运算符与运算符用符号“&”表示,其使用规律如下:两个操作数中位都为1,结果才为1,否则结果为0,例如下面的程序段。

public class data13{public static void main(String[] args){int a=129;int b=128;System.out.println("a 和b 与的结果是:"+(a&b));}}运行结果a 和b 与的结果是:128下面分析这个程序:“a”的值是129,转换成二进制就是10000001,而“b”的值是128,转换成二进制就是10000000。

根据与运算符的运算规律,只有两个位都是1,结果才是1,可以知道结果就是10000000,即128。

2.或运算符或运算符用符号“|”表示,其运算规律如下:两个位只要有一个为1,那么结果就是1,否则就为0,下面看一个简单的例子。

public class data14{public static void main(String[] args){int a=129;int b=128;System.out.println("a 和b 或的结果是:"+(a|b));}}运行结果a 和b 或的结果是:129下面分析这个程序段:a 的值是129,转换成二进制就是10000001,而b 的值是128,转换成二进制就是10000000,根据或运算符的运算规律,只有两个位有一个是1,结果才是1,可以知道结果就是10000001,即129。

3.非运算符非运算符用符号“~”表示,其运算规律如下:如果位为0,结果是1,如果位为1,结果是0,下面看一个简单例子。

java移位运算符

java移位运算符

Java移位运算符移位运算符是一种用来对二进制数字进行移位操作的运算符。

在Java中,有三种移位运算符:左移(<<)、右移(>>)和无符号右移(>>>)。

本文将详细介绍这些移位运算符的用法和示例。

左移运算符(<<)左移运算符将二进制数向左移动指定的位数,并将右侧空出的位用0填充。

左移运算符的语法如下:result = number << n;其中,number是要进行左移操作的数,n是要左移的位数,result是计算结果。

左移运算符的示例:int number = 8; // 二进制表示为 00001000int result = number << 2; // 左移两位,结果为 00100000,即十进制的32在上面的示例中,将数值8左移两位,得到的结果是32。

可以看出,左移运算符将二进制数向左移动了指定的位数。

右移运算符(>>)右移运算符将二进制数向右移动指定的位数,并根据原始数字的符号位进行填充。

对于正数,右移时在左侧用0填充,在负数时在左侧用1填充。

右移运算符的语法如下:result = number >> n;其中,number是要进行右移操作的数,n是要右移的位数,result是计算结果。

右移运算符的示例:int number = 16; // 二进制表示为 00010000int result = number >> 3; // 右移三位,结果为 00000010,即十进制的2通过将数值16右移三位,我们得到了结果2。

注意到在这个示例中,原始数字是正数,因此右移时在左侧用0填充。

无符号右移运算符(>>>)无符号右移运算符将二进制数向右移动指定的位数,并在左侧用0进行填充。

无符号右移运算符的语法如下:result = number >>> n;其中,number是要进行无符号右移操作的数,n是要右移的位数,result是计算结果。

java 负数 右移位运算

java 负数 右移位运算

java 负数右移位运算Java中的右移位运算是一种位运算操作,用于将一个数的二进制表示向右移动指定的位数。

对于正数来说,右移位运算是一种简单的操作,但对于负数来说,右移位运算可能会导致一些意想不到的结果。

在Java中,整数的二进制表示采用补码形式。

正数的补码和原码相同,而负数的补码是将其对应的正数的补码按位取反,然后再加1。

这就意味着负数的二进制表示最高位是1,而正数的二进制表示最高位是0。

在进行右移位运算时,Java采用的是算术右移。

算术右移是指将一个数的二进制表示向右移动指定的位数,并且将最高位(符号位)的值保持不变。

也就是说,如果最高位是0,则在移位过程中在最高位补0;如果最高位是1,则在移位过程中在最高位补1。

对于正数来说,算术右移的结果是符合预期的。

例如,对于十进制数5(二进制表示为00000101),右移1位后得到十进制数2(二进制表示为00000010),右移2位后得到十进制数1(二进制表示为00000001)。

然而,对于负数来说,算术右移可能会导致一些问题。

这是因为负数的二进制表示最高位是1,而在算术右移过程中会在最高位补1。

这样就会导致右移后的结果仍然是一个负数。

例如,对于十进制数-5(二进制表示为11111011),右移1位后得到十进制数-3(二进制表示为11111101),右移2位后得到十进制数-2(二进制表示为11111110)。

这种情况下,负数的右移位运算结果可能会导致一些意想不到的结果。

比如,右移一位后得到的结果不是-2而是-3。

这是因为在进行右移位运算时,最高位的1会向右移动,而右移后的结果仍然是一个负数,所以最高位的1会被保留下来,导致结果变成了-3。

这种情况下,我们可以使用无符号右移位运算来解决这个问题。

无符号右移位运算是指将一个数的二进制表示向右移动指定的位数,并且在最高位补0。

这样就可以保证右移后的结果是一个正数,而不是负数。

在Java中,使用无符号右移位运算可以通过将右移运算符(>>)替换为无符号右移运算符(>>>)来实现。

课题_java中的移位运算符:总结

课题_java中的移位运算符:总结

java中的移位运算符:<<,>>,>>>总结java中有三种移位运算符<< : 左移运算符,num << 1,相当于num乘以2>> : 右移运算符,num >> 1,相当于num除以2>>> : 无符号右移,忽略符号位,空位都以0补齐下面来看看这些移位运算都是怎样使用的1/**2*3*/4package com.b510.test;56/**7* @author Jone Hongten8* @create date:2013-11-29* @version1.010*/11public class Test {1213public static void main(String[] args) {14int number = 10;15//原始数二进制16printInfo(number);17number = number << 1;18//左移一位19printInfo(number);20number = number >> 1;21//右移一位22printInfo(number);23}2425/**26* 输出一个int的二进制数27* @param num28*/29private static void printInfo(int num){30System.out.println(Integer.toBinaryString(num));31}32}运行结果为:1010101001010我们把上面的结果对齐一下:43210 位数--------1010 十进制:10 原始数number10100 十进制:20 左移一位number = number << 1; 1010 十进制:10 右移一位number = number >> 1; 看了上面的demo,现在是不是对左移和右移了解了很多了呢对于:>>>无符号右移,忽略符号位,空位都以0补齐value >>> num -- num 指定要移位值value 移动的位数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

位运算
位运算符C语言提供了六种位运算符:
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移
1. 按位与运算按位与运算符"&"是双目运算符。

其功能是参与运算的两数各对应的二进位相与。

只有对应的两个二进位均为1时,结果位才为1,否则为0。

参与运算的数以补码方式出现。

例如:9&5可写算式如下:00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。

按位与运算通常用来对某些位清0或保留某些位。

例如把 a 的高八位清0 ,保留低八位,可作a&255 运算( 255 的二进制数为0000000011111111)。

main(){
int a=9,b=5,c;
c=a&b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
2. 按位或运算按位或运算符“|”是双目运算符。

其功能是参与运算的两数各对应的二进位相或。

只要对应的二个二进位有一个为1时,结果位就为1。

参与运算的两个数均以补码出现。

例如:9|5可写算式如下:00001001|00000101
00001101 (十进制为13)可见9|5=13
main(){
int a=9,b=5,c;
c=a|b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
3. 按位异或运算按位异或运算符“^”是双目运算符。

其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。

参与运算数仍以补码出现,例如9^5可写成算式如下:00001001^00000101 00001100 (十进制为12) main(){
int a=9;
a=a^15;
printf("a=%d\n",a);
}
4. 求反运算求反运算符~为单目运算符,具有右结合性。

其功能是对参与运算的数的各二进位按位求反。

例如~9的运算为:~(0000000000001001)结果为:1111111111110110
5. 左移运算左移运算符“<<”是双目运算符。

其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,
高位丢弃,低位补0。

例如:a<<4 指把a的各二进位向左移动4位。

如a=00000011(十进制3),左移4位后为00110000(十进制48)。

6. 右移运算右移运算符“>>”是双目运算符。

其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。

例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。

应该说明的是,对于有符号数,在右移时,符号位将随同移动。

当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。

Turbo C和很多系统规定为补1。

Java 移位运算符的注意事项和小技巧
(1) 移位运算符适用类型有byte、short、char、int、long
(2) 对低于int型的操作数将先自动转换为int型再移位。

(3) 对于int型整数移位a>>b,系统先将b对32取模,得到的结果才是真正移位的位数。

例如:a>>33和a>>1结果是一样的,a>>32的结果还是a原来的数字。

(4) 对于long型整数移位时a>>b ,则是先将移位位数b对64取模。

移位不会改变变量本身的值。

如a>>1;在一行语句中单独存在,毫无意义。

(5) x>>1的结果和x/2的结果是一样的,x<<2和x*4的结果也是一样的。

总之,一个数左移n位,就是等于这个数乘以2的n次方,一个数右移n位,就是等于这个数除以2的n次方。

请思考:如何用程序实现求2的x次方。

答案:y = 1<< x;。

相关文档
最新文档