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 移动的位数。

Java移位运算符详解实例

Java移位运算符详解实例

Java移位运算符详解实例移位运算符它主要包括:左移位运算符(<<)、右移位运算符(>>>)、带符号的右移位运算符(>>),移位运算符操作的对象就是⼆进制的位,可以单独⽤移位运算符来处理int型整数。

运算符含义<<左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0)>>"有符号"右移运算符,将运算符左边的对象向右移动运算符右边指定的位数。

使⽤符号扩展机制,也就是说,如果值为正,则在⾼位补0,如果值为负,则在⾼位补1.>>>"⽆符号"右移运算符,将运算符左边的对象向右移动运算符右边指定的位数。

采⽤0扩展机制,也就是说,⽆论值的正负,都在⾼位补01.左移运算符左移运算符⽤“<<”表⽰,是将运算符左边的对象,向左移动运算符右边指定的位数,并且在低位补零。

其实,向左移n 位,就相当于乘上2 的n 次⽅,例如下⾯的例⼦。

public class test{public static void main(String[] args) {int a=2,b=2,c;c=a<<b;System.out.print("a 移位的结果是"+c);}}输出结果:8分析上⾯代码,2 的⼆进制是00000010,它向左移动2 位,就变成了00001000,即8。

如果从另⼀个⾓度来分析,它向左移动2 位,其实就是乘上2 的2 次⽅,结果还是82.⽆符号右移运算符右移运算符⽆符号⽤“>>>”表⽰,是将运算符左边的对象向右移动运算符右边指定的位数,并且在⾼位补0,其实右移n 位,就相当于除上2 的n 次⽅public class test{public static void main(String[] args) {int a=16;int b=2;System.out.println("a 移位的结果是"+(a>>>b));}}输出结果:4分析上⾯代码:16 的⼆进制是00010000,它向右移动2 位,就变成了00000100,即4。

Java中与、或、^异或、《左移位、》右移位

Java中与、或、^异或、《左移位、》右移位

Java中与、或、^异或、《左移位、》右移位 1public static void main(String[] args) {2/*3 * &:与运算4 * 全为1则为1,否则为05*/6 System.out.print(1 & 0);7 System.out.print("--");8 System.out.print(1 & 1);9 System.out.print("--");10 System.out.println(0 & 0);11// out:0--1--01213/*14 * |:或运算15 * 全为0则为0,否则为116*/17 System.out.print(1 | 0);18 System.out.print("--");19 System.out.print(1 | 1);20 System.out.print("--");21 System.out.println(0 | 0);22// out:1--1--02324/*25 * ^:异或运算26 * 相同为0,不同为127*/28 System.out.print(1 ^ 0);29 System.out.print("--");30 System.out.print(1 ^ 1);31 System.out.print("--");32 System.out.println(0 ^ 0);33// out:1--0--034 }关于'<<'与'>>'操作:m<<n,表⽰m⼆进制,右边尾部加0;m>>n,表⽰m⼆进制,右边尾部去掉1位;m>>>n,表⽰m⼆进制,忽略其符号位,从左⾄右,去掉最后的n位;不存在'<<<';1public static void main(String[] args) {2int integer = 2;3 printBinary(integer);4 integer = 2 >> 1;5 printBinary(integer);6 integer = 2 >> 2;7 printBinary(integer);8 integer = 2 >> 3;9 printBinary(integer);10 System.out.println("====================");11 integer = 2 << 1;12 printBinary(integer);13 integer = 2 << 2;14 printBinary(integer);15 integer = 2 << 3;16 printBinary(integer);17 System.out.println("====================");18 integer = -2 << 1;19 printBinary(integer);20 System.out.println("====================");21 integer = -2 >> 1;22 printBinary(integer);23 System.out.println("====================");24 integer = 3 >> 1;25 printBinary(integer);26 System.out.println("====================");27 integer = -2;28 printBinary(integer);29 printBinary(integer>>>1);30 printBinary(-integer);31 printBinary(-integer>>>1);32 }33private static void printBinary(Integer integer) {34 System.out.println("Integer.toBinaryString()="+Integer.toBinaryString(integer)+", integer="+integer);35 }36/**37 Integer.toBinaryString()=10, integer=238 Integer.toBinaryString()=1, integer=139 Integer.toBinaryString()=0, integer=040 Integer.toBinaryString()=0, integer=041 ====================42 Integer.toBinaryString()=100, integer=443 Integer.toBinaryString()=1000, integer=844 Integer.toBinaryString()=10000, integer=1645 ====================46 Integer.toBinaryString()=11111111111111111111111111111100, integer=-447 ====================48 Integer.toBinaryString()=11111111111111111111111111111111, integer=-149 ====================50 Integer.toBinaryString()=1, integer=151 ====================52 Integer.toBinaryString()=11111111111111111111111111111110, integer=-253 Integer.toBinaryString()=1111111111111111111111111111111, integer=214748364754 Integer.toBinaryString()=10, integer=255 Integer.toBinaryString()=1, integer=156*/。

java字符串移位 方法

java字符串移位 方法

java字符串移位方法Java字符串移位方法在Java编程语言中,字符串是最常被使用的数据类型之一。

字符串移位指的是将字符串的字符按照一定的规则进行重新排列。

本文将介绍几种常见的Java字符串移位方法,并逐步解释其实现过程和使用方法。

一、左移位方法左移位是将字符串的字符往左移动的操作。

具体的实现方法如下:public static String leftShift(String str, int n) {int len = str.length();n = len;return str.substring(n) + str.substring(0, n);}首先,我们需要定义一个名为leftShift的方法。

该方法接受两个参数:str 表示要进行移位操作的字符串,n表示需要移动的字符数。

然后,我们使用字符串的长度来对移动字符数进行取余操作,以防止移动字符数超出字符串长度。

最后,我们将字符串拆分为两部分,分别是移位后的字符和未移位的字符。

然后再将这两部分拼接在一起,即可得到移位后的字符串。

接下来,我们通过一个示例来演示如何使用左移位方法:public static void main(String[] args) {String str = "abcdef";int n = 2;String result = leftShift(str, n);System.out.println(result);}运行上述代码,输出结果为“cdefab”。

这是因为我们将字符串“abcdef”向左移动了两个字符,得到了新的字符串“cdefab”。

二、右移位方法右移位是将字符串的字符往右移动的操作。

具体的实现方法如下:public static String rightShift(String str, int n) {int len = str.length();n = len;return str.substring(len - n) + str.substring(0, len - n);}右移位方法的实现与左移位方法类似,只是在拆分字符串时的顺序相反。

技术干货:Java中的位移运算

技术干货:Java中的位移运算

技术干货:Java中的位移运算技术干货:Java中的位移运算,在Java中,位移运算属于基本运算,符号是<<和>>,即向左位移和向右位移。

在Java中只有整数才能位移,所以其他的不考虑,位移运算是将整数在内存中表示的二进制进行位移,所以在Java中分为正数和负数的位移。

对于正数来说,向左位移,即<<相当于乘以2,移动多少次即乘以多少次2,例如5<<2即5 * 2 * 2 = 20,而向右位移即>>相当于除以2,注意是整数除以整数。

例如 5 >> 1 即5/2=2。

下面举例说明:5<<1,我们以int为例:数字5int型的二进制表示为: 0000 0000 0000 0000 0000 0000 0000 0101向左移1位即: 0000 0000 0000 0000 0000 0000 0000 1010 (后位补0)所以结果为:数字105>>1,我们以int为例:数字5int型的二进制表示为: 0000 0000 0000 0000 0000 0000 0000 0101向右移1位即: 0000 0000 0000 0000 0000 0000 0000 0010 (高位补0)所以结果为:数字2所以对于正数,可以随意使用位移,与乘除几乎没有结果的区别,而且性能更优。

而对于负数来说,Java中的位移应该谨慎使用,因为位移运算在Java中称为带符号的位移。

那么到底带符号的位移是如何计算的呢,下面直接举例说明:-5<<1,我们以int为例,由于负数在内存是以补码存在,请看:数字-5int型的二进制原码表示为:1000 0000 0000 0000 0000 0000 0000 0101而其反码为:1111 1111 1111 1111 1111 1111 1111 1010 补码为:1111 1111 1111 1111 1111 1111 1111 1011向左移1位即结果为:1111 1111 1111 1111 1111 1111 1111 0110 (后位补0)将结果计算反码为:1111 1111 1111 1111 1111 1111 1111 0101将结果计算原码为:1000 0000 0000 0000 0000 0000 0000 1010所以结果为:数字-10看起来好像还是乘以2,但是换个数字来试试:例如数字的二进制如果为:1110 0000 0000 0000 0000 0000 0000 0001而其反码为:1001 1111 1111 1111 1111 1111 1111 1110 补码为:1001 1111 1111 1111 1111 1111 1111 1111向左移1位即结果为:0011 1111 1111 1111 1111 1111 1111 1110这个结果的最高位是0,所以必然是个正数,所以结果并非想象的乘以2。

Java中的位运算

Java中的位运算

Java中的位运算位运算是计算机中一种特殊的运算方式,它直接对二进制数进行操作。

在Java中,位运算提供了一种高效且灵活的处理二进制数据的方式。

本文将介绍Java中的位运算符及其使用方法,以及位运算在程序开发中的常见应用场景。

一、按位与运算(&)按位与运算符(&)用来判断两个二进制数的对应位是否同时为1,如果是,则结果为1;否则结果为0。

在Java中,按位与运算可以用于掩码操作、判断某个特定位置上的位是否为1等情况。

示例代码:```javaint a = 5; // 二进制表示为 00000101int b = 3; // 二进制表示为 00000011int result = a & b; // 位运算结果为 00000001,即1System.out.println(result);```二、按位或运算(|)按位或运算符(|)用来判断两个二进制数的对应位是否有一个为1,如果是,则结果为1;否则结果为0。

在Java中,按位或运算可以用于将某些特定位设置为1、进行权限控制等情况。

示例代码:```javaint a = 5; // 二进制表示为 00000101int b = 3; // 二进制表示为 00000011int result = a | b; // 位运算结果为 00000111,即7System.out.println(result);```三、按位异或运算(^)按位异或运算符(^)用来判断两个二进制数的对应位是否不相同,如果不相同,则结果为1;否则结果为0。

在Java中,按位异或运算可以用于进行数字的交换、检测奇偶性等情况。

示例代码:```javaint a = 5; // 二进制表示为 00000101int b = 3; // 二进制表示为 00000011int result = a ^ b; // 位运算结果为 00000110,即6System.out.println(result);```四、按位取反运算(~)按位取反运算符(~)用来对一个二进制数进行按位取反操作,即将0变为1,1变为0。

java位运算使用方法

java位运算使用方法

java位运算使⽤⽅法
java位运算使⽤⽅法
本⽂讲解Java位运算符&,|,^,~,<<,>>,>>>
以下例⼦的初始A/B/C值为:
A 0000 0011
B 0110 1110
C 1111 1011
位运算符名称位运算符使⽤⽅式解释举例说明
与&A&B每⼀位分别计算:A与B同为1结果为1,有⼀个0则为0A&B=00000010或|A|B每⼀位分别计算:A与B同为0结果为0,有⼀个为1则为1A&B=01101111异或^A^B每⼀位分别计算:A与B不同,则为1,相同则为0A&B=01101101⾮~~A对A每⼀位取反A=11111100
左移<<B<<2B左移2位,左边超过⼋位的舍去,右边补0B=10111000
右移(场景1)>>B>>2场景1:B为正数,B右移2位,右边超过部分舍去,左边补上0B=00011011
右移(场景2)>>C>>2场景2:C为负数,C右移2位,右边超过部分舍去,左边补上1C=11111110
⽆符号右移>>>B>>>2B右移2位,右边超过部分舍去,右边超出部分补0B=00011011。

  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;。

相关文档
最新文档