原码,反码,补码 及 移位运算

 在计算机中都是按字节来储存了,1个字节等于8位(1Byte=8bit),而计算机只能识别0和1这两个数,所以我们编写的程序最后都要转换成二进制。

1个字节8位(1Byte=8bit),一个字节为用8个0或1来表示(每个便是1bit)如:0110  0011

(大家都知道,开始的时候电脑是由老外搞出来的,那个时候不支持中文,后来加入中文编码,和其他语言的编码规则,所以造成编码后字节不同)在JAVA中,一个char是2个字节(byte),一个中文汉字是一个字符,2个字节(byte),而英文字母和数字字符是一个字节(byte)。所以char类型的内容有的时候是1个字节,有的时候是2个字节。int是4个字节,long是8个字节。

二进制整数分:无符号整数和有符号整数

无符号整数,如:

有符号整数,如:

有无符号的辨别:

存储的数字不区分有无符号,关键在于你要怎么去解析使用它。如果作为无符号,就是255,如果看成有符号就是-1。由人为的协议规定,在高级语言中由变量的类型来标识出。如果看成“有符号”整型,标志位是区分的标志。

原码,反码,补码:

无符号整数是没有原码反码补码概念的,只有当给定的值以有符号来使用时才有这一概念。

正数原码为十进制数的二进制值。

正数原码,反码,补码相同

负数原码为十进制数的二进制值,再在首位(符号位设置值为1)。

负数反码为原码除了符号位值不变其他为取反。

负数补码为负数反码加1。

如:

有符号的整数    原码    反码    补码

65                                  0100 0001      0100 0001     0100 0001

-65                                 1100 0001      1011 1110     1011 1111

在计算机中数值是以补码的形式存储的,可以理解为正数是以原码形式存储的,负数是以补码的形式存储的。

如:

65  计算机中存储(原码) 0100 0001        及十进制65  -->二进制值为:0100 0001

15 计算机中存储(原码)   0000 1111        及十进制15  -->二进制值为:0000 1111

-15 计算机中存储(补码) 1111 0010       及十进制-15  -->二进制值为:1000 1110

 

移位运算

移位运算符
包括:
“>> 右移,高位补符号位”;
“>>> 无符号右移,高位补0”;
“<< 左移”;

例子:
-5>>3=-1
1111 1111 1111 1111 1111 1111 1111 1011
1111 1111 1111 1111 1111 1111 1111 1111
其结果与 Math.floor((double)-5/(2*2*2)) 完全相同。

-5<<3=-40
1111 1111 1111 1111 1111 1111 1111 1011
1111 1111 1111 1111 1111 1111 1101 1000
其结果与 -5*2*2*2 完全相同。

5>>3=0
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0000 0000
其结果与 5/(2*2*2) 完全相同。

5<<3=40
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0010 1000
其结果与 5*2*2*2 完全相同。

-5>>>3=536870911
1111 1111 1111 1111 1111 1111 1111 1011
0001 1111 1111 1111 1111 1111 1111 1111

无论正数、负数,它们的右移、左移、无符号右移 32 位都是其本身,比如 -5<<32=-5、-5>>32=-5、-5>>>32=-5。
一个有趣的现象是,把 1 左移 31 位再右移 31 位,其结果为 -1。
0000 0000 0000 0000 0000 0000 0000 0001
1000 0000 0000 0000 0000 0000 0000 0000
1111 1111 1111 1111 1111 1111 1111 1111

位逻辑运算符
包括:
& 与;
| 或;
~ 非(也叫做求反);
^ 异或

“& 与”、“| 或”、“~ 非”是基本逻辑运算,由此可以演变出“与非”、“或非”、“与或非”复合逻辑运算。“^ 异或”是一种特殊的逻辑运算,对它求反可以得到“同或”,所以“同或”逻辑也叫“异或非”逻辑。

例子:
5&3=1
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0001

-5&3=1
1111 1111 1111 1111 1111 1111 1111 1011
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0011

5|3=7
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0111

-5|3=-5
1111 1111 1111 1111 1111 1111 1111 1011
0000 0000 0000 0000 0000 0000 0000 0011
1111 1111 1111 1111 1111 1111 1111 1011

~5=-6
0000 0000 0000 0000 0000 0000 0000 0101
1111 1111 1111 1111 1111 1111 1111 1010

~-5=4
1111 1111 1111 1111 1111 1111 1111 1011
0000 0000 0000 0000 0000 0000 0000 0100

5^3=6
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0110

-5^3=-8
1111 1111 1111 1111 1111 1111 1111 1011
0000 0000 0000 0000 0000 0000 0000 0011
1111 1111 1111 1111 1111 1111 1111 1000

参考:

http://www.cnitblog.com/mantou/archive/2011/11/20/1239.html

http://eneasy.iteye.com/blog/182557

http://zhidao.baidu.com/question/294860268.html

http://wenku.baidu.com/view/a3b6234ac850ad02de804112.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值