位运算

/*计算机由复杂电子元器件构成,一个电子元器件有带电和不带电的两种状态,1和0 多个这样的元器件的组合可以表示更多状态,也就是可以表示更多的数据,一个元器件可以表示一位(bit)数据,这种表示数据的方式称为2进制在实际的电子设备中,将8个元器件组合在一起,形成一个单元,这样的单元叫做一个字节(byte) 一个字节能表示2^8=256个数,即0-255 2个字节能表示2^16个数,即0-2^16-1 4个字节能表示2^32个数,即0-2^32-1 一个字节(byte)由8个二进位(bit)组成,最右边的称为最低有效位,最左边的称为最高有效位每一个二进位的值都是0或1*/ /*在计算机中常采用16位进制的方法,因为二进制书写太长,容易出错 16进制的f代表十进制中的15,在二进制中需要4位(bit)1111来书写 16进制中的ff代表十进制的255,在二进制中需要8位(bit)11111111来书写*/ //在计算机中只有数值,可以用数值表示不同的含义,如内存的数值可代表不同的含义

//原码、反码和补码 /*原码:将最高位作为符号位(1为负,0为正),其余各位代表数值本身的绝对值(二进制表示)以一个字节的数值为例:+7:00000111 -7:10000111 而问题在于:+0:00000000 -0:10000000 这样表示数值不唯一,因而在计算机中很少采用原码*/ /*反码:一个数如果为正,则它的反码和原码相同,如果为负,符号位为1,其余各位对原码取反如:+7的原码是:00000111 +7的反码是:00000111 -7的原码是:10000111 -7的反码是:11111000 问题还是:+0的反码是:00000000 -0的反码是:11111111*/ /*补码:利用溢出,我们可以将减法变成加法//主要就是怎么操作、运算,使结果满足我们的需要对于十进制,如果要从9得到结果5,我们可以用减法: 9-4=5 因为4+6=10,我们将6作为4的补数,将上式的减法改成加法: 9+6=15 去掉高位1(也就是减去10),得到结果5

对于16进制,如果从C得到结果5,我们可以用减法: C-7=5 因为7+9=16,我们将9作为7的补数,将上式的减法改成加法: C+9=15(十进制中21)去掉高位1(也就是减去16),得到结果5*/ /*在计算机中,如果我们采用1个字节来表示一个数,则这个字节有8位(bit) 超过8位(bit)就进1,在内存中情况为: 1 00000000 进位1被丢弃*/ /*补码:如果一个数如果为正,则它的原码、反码和补码相同如果一个数为负,则符号位为1,其余各位对原码取反,然后整个数加1 为了简单起见,以一个字节来表示一个整数:+7的原码为:00000111 +7的补码为:00000111 -7的原码为:10000111 -7的补码为:11111000//第一步取反                   +1//第二步加1              ----              11111001//得到结果 0的补码表示为: +0的补码为:00000000 -0的补码为:10000000 第一步 取反:11111111 第二步 加1:100000000 第三步进位1被丢弃,得到结果00000000与+0的表示相同*/ /*已知一个负数的补码,转换成十进制数,步骤为: 1.先对各位取反 2.将其转换成十进制数 3.加上符号,再减去1 例如:11111010,最高位是1,是负数,先对各位取反,变成00000101;转换成十进制数5,加上符号,变成-5,再减去1,变成-6*/

//位运算符(是对位(bit)进行运算,而不是对数值进行运算) /*Java中有4个位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 按位取反 1.按位与 01101101 & 00110111 ---- 00100101 结论:按位与,只有壹(1)壹(1)与操作为1 2.按位或    01101101 |    00110111    ----    01111111 结论:按位或,只有零(0)零(0)或操作为0 3.按位异或    01101101 ^    00110111    ----    01011010 结论:按位异或,只有零(0)壹(1)或者壹(1)零(0)异或操作为1 4.按位取反 ~ 01101101    ----    10010010 结论:按位取反,只要将1变成0,0变成1

//Java中的移位运算符 /*java中三个移位运算符:左移:<< 带符号右移:>> 无符号右移:>>>

移位运算:

右移有两种:   右移运算符>>(有符号)   用来将一个数的各二进制位全部右移若干位.例如:a   =   a>>2,使a的各二进制位右移两位,移到右端的低位被舍弃,最高位则移入原来高位的值.   如:a   =   00110111,则a>>2=00001101,b=11010011,则b>>2   =   11110100       右移一位相当于除2   取商,而且用右移实现除法比除法运算速度要快     无符号右移运算符>>> (貌似是java特有的) 用来将一个数的各二进制位无符号右移若干位,与运算符>>相同,移出的低位被舍弃,但不同的是最高位补0,如a   =   00110111,则a>>>2   =   00001101,b=11010011,则b>>>2   =   00110100

“ < <”, “> > ”, “> > > ”在Java中是左移、有符号右移和无符号右移运算符。位移运算符只对int值进行操作,如果不是int,编译器会报错。在Java中,一个int的长度始终是32bit,也就是4个字节。

(1)左移动运算符:会将操作的数向左边移动,移动的位的个数由左操作数指定,左移后,低位会被自动补零(0)。(2)右移动运算符:反过来,把操作数向右移动,移动的位个数同样由右操作数指定。注意:面对带正负号的数,会采用符号扩展,如果原值是正数,则高位补上0;如果原值是负数,高位补1。(3)无正负号的右移运算符(>>>):采用0补充,意思就是说,无论是正号还是负号,都在高位补0。

下面我要对这三个运算符进行详细解析:

1:准备 知识

能够将 正数 和 负数 的二进制码进行 熟练的转换;

转换原则: 取反加“1”

如有疑问,参见文章 “java基本知识系列三”中的内容

2:以实例来 说明分析 运算 操作。

public class Test {

public static void main(String[] args) {

int m=-7;

System.out.println("m的二 进 制 码是:"+Integer.toBinaryString(m));

System.out.println("m>>2的二进制码是:"+Integer.toBinaryString(m>>2));

System.out.println("(m>>2)="+(m>>2));

System.out.println("m<<2的二进制码是:"+Integer.toBinaryString(m<<2));

System.out.println("(m<<2)=:"+(m<<2));

System.out.println("m>>>24的二进制码是:"+Integer.toBinaryString(m>>>24));

System.out.println(" m>>>24 :"+ (m>>>24));

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值