java中的位运算代码 java 位运算

JAVA 位运算 (byte) (a

您好,你的问题,我之前好像也遇到过,以下是我原来的解决思路和方法,希望能帮助到你,若有错误,还望见谅!展开全部

业务包括:企业网站建设、手机网站制作设计电子商务商城网站建设、网站营销推广等服务,并且涵盖域名与空间、虚拟空间、云服务器、等互联网基础服务;成都创新互联公司联建站以互联网的创新理念,成熟完善的建站体系,开拓进取的精神,专业的解决方案和顾问咨询服务,帮助客户在互联网时代提升形象、把握商机、实现价值,提高企业的核心竞争力。

你看下这篇文章就清楚了

首先要明白一点,这里面所有的操作都是针对存储在计算机中中二进制的操作,那么就要知道,正数在计算机中是用二进制表示的,负数在计算机中使用补码表示的。

左移位:,有符号的移位操作

左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用0补充

右移位:,有符号的移位操作

右移操作是将运算数的二进制码整体右移指定位数,右移之后的空位用符号位补充,如果是正数用0补充,负数用1补充。

例子:

public static void main(String[] args)

{

System.out.println(32);//3左移2位

System.out.println(-32);//-3左移2位

System.out.println(62);//6右移2位

System.out.println(-62);//-6右移2位

}

输出结果

12

-12

1

-2

下面解释一下:

00000000 00000000 00000000 00000011 +3在计算机中表示

00000000 00000000 00000000 0000001100 左移2位,补0,结果为12

----------------------------------------------------------------------------------------------

00000000 00000000 00000000 00000011 +3在计算机中表示

11111111 11111111 11111111 11111100

11111111 11111111 11111111 11111101 -3在计算机中表示

11111111 11111111 11111111 1111110100 左移2位,补0,结果为负数,就是补码了,求原码

10000000 00000000 00000000 00001011

10000000 00000000 00000000 00001100 结果-12

----------------------------------------------------------------------------------------------

这也说明了一个问题:在计算机中,以1开头的就是补码的形式,是负数。

00000000 00000000 00000000 00000110 +6在计算机中表示方法

0000000000 00000000 00000000 00000110 右移两位,正数补0,结果为1

----------------------------------------------------------------------------------------------

00000000 00000000 00000000 00000110 +6在计算机中表示方法

11111111 11111111 11111111 11111001

11111111 11111111 11111111 11111010 -6在计算机中的表示

1111111111 11111111 11111111 11111010 右移两位,结果为负数

1000000000 00000000 00000000 000001

1000000000 00000000 00000000 000010 结果为-2

这个地方很容易弄混,多想几次就会慢慢理解了。

上面解释了带符号的移位操作,下面解释一下不带符号的移位操作

无符号的移位只有右移,没有左移使用“”进行移位,都补充0

例如:

public static void main(String[] args)

{

System.out.println(62);

System.out.println(-62);

}

结果:

1

1073741822

分析:

00000000 00000000 00000000 00000110 +6在计算机中表示方法

0000000000 00000000 00000000 00000110 右移两位,正数补0,结果为1

-----------------------------------------------------------------------------------------------------

00000000 00000000 00000000 00000110 +6在计算机中表示方法

11111111 11111111 11111111 11111001

11111111 11111111 11111111 11111010 -6在计算机中的表示

0011111111 11111111 11111111 11111010 右移两位,补充0,结果为1073741822

以下来自:

可以参考

移位操作要注意的问题是高(低)位是补0还是补1和对char, byte, short型的操作:

(1) : (left-shift), 最低位补0

(2) : (signed right-shift), 右移过程使用符号位扩展(sign extension),即如果符号为为1则高位补1, 是0则补0,也就是逻辑右移

(3) : (unsigned right-shit),右移过程使用零扩展(zero extension),即最高位一律补0,也就是算术右移

(4)移位操作的数据类型可以是byte, char, short, int, long型,但是对byte, char, short进行操作时会先把它们变成一个int型,最后得到一个int型的结果,对long型操作时得到一个long型结果,不可以对boolean型进行操作。

(5)移位操作符可以和=合并起来,即 = 、 = 和 =。例如 a = 2; 表示将a右移两位后的值重新赋给a。当时在使用这三个操作符对 byte, char, short型数据进行操作时要注意,例如有一下代码片段:非常感谢您的耐心观看,如有帮助请采纳,祝生活愉快!谢谢!

JAVA位运算符

运算符 含义 示例

~ 按位非(NOT) b = ~a

按位与(AND) c = a b

| 按位或(OR) c = a | b

^ 按位异或(XOR) c = a ^ b

右移 b = a 2

右移,左边空出的位以0填充 b = a 2

左移 b = a 1

当然同样有 =,|=,^=,=,=,=。

有关这些操作的细节可以参看

位运算

前面介绍的各种运算都是以字节作为最基本位进行的。 但在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能, 这使得C语言也能像汇编语言一样用来编写系统程序。

一、位运算符C语言提供了六种位运算符:

按位与

| 按位或

^ 按位异或

~ 取反

左移

右移

1. 按位与运算 按位与运算符""是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。

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

按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a255 运算 ( 255 的二进制数为0000000011111111)。

main(){

int a=9,b=5,c;

c=ab;

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. 按位异或运算 按位异或运算符“^”是双目运算符。

JAVA 位运算

楼上是错的...

public class Test

{

public static void main(String[] args)

{

byte b=(byte)0xf1 ;

byte d=(byte)(b4);

System.out.println(d);

byte a=(byte)0xf1;

byte e=(byte)((a0xff)4);

System.out.println(e);

}

}

输出为

-1

15

解释如下:

问题1:

1.0xf1,这是直接书写的文字常量,java默认情况下表示int型,即0x000000f1

2.(byte)0xf1,是将int显示转化为byte,即强行截断取最低字节,即取0x000000f1的最低字节0xf1,所以得到的byte在内存里是0xf1,因为byte是有符号的,所以b是负数

3.位移会先将左边的数转化为int,再位移;负数扩展左边添1,所以0xf1扩展为0xfffffff1,添0右移4位结果是0x0fffffff

4.最后将int型的0x0fffffff显示转化为byte,即截断最低字节,得到0xff,即byte值的-1,所以输出为-1

问题2:

同理

1.(byte)0xf1是截断int值的最低字节得到0xf1,也是一个byte型负数

2.b0xff,左边是byte型,右边的文字常量默认是int型,所以左边的byte先为扩展为0xffffffff的int型,与右边的int值位与,所以b0xff的最终结果是int型的0x000000ff

3.将b0xff按符号位扩展右移4位,得到0x0000000f,最后截断最低字节得到byte值0x0f,所以e为0x0f,输出得到15

ok,就是这样


网站栏目:java中的位运算代码 java 位运算
转载来源:http://scyanting.com/article/ddocjis.html