位运算 & 网络序字节序

一、初识位运算

位运算,见词明意,二进制运算,通常需要将运算数转换为二进制再进行处理,如果是在程序语言中则无需自己进行进制转换,基本的位操作符有如下几种:与(&)、或(|)、异或(^)、取反(~)、左移(<<)、右移(>>),它们的运算规则如下所示:

 

扩展:进制转换

  此处简单提一下进制转换:bit表示一个二进制位;byte表示一个字节(8bit),表示-128至127之间的整数值;整数234567的内存写照为:00000000 00000011 10010100  01000111(十进制转换为二进制);Java中二进制、八进制、十进制、十六进制间相互转换,方式如下:

  十进制转成二进制:

    Integer.toBinaryString(int i)

  十进制转成八进制:

    Integer.toOctalString(int i)

  十进制转成十六进制:

    Integer.toHexString(int i)

  二进制转十进制:

    Integer.valueOf("0101",2).toString()

  八进制转成十进制:

    Integer.valueOf("876",8).toString()

  十六进制转成十进制:

    Integer.valueOf("FFFF",16).toString()

  上面提到的几种进制转换都是由Java的内置方法进行处理的,正负整数在计算机内部的写照可以参考[负数的二进制表示方法]进行手工转换,我们知道负数在计算机内部是用补码表示的,则针对负整数-3976,从原码、反码、补码角度来看其在计算机内部的写照:

原码:0000 0000 0000 0000 0000 1111 1000 1000

反码:1111 1111 1111 1111 1111 0000 0111 0111

补码:1111 1111 1111 1111 1111 0000 0111 1000

由上可知,-1的内存写照为:11111111111111111111111111111111


二、例题详解

1、右移(>>)

将操作符左边的数向右移动指定的位数,从高位开始,统一向右移动指定的位数,前面补0

那么现在内存中234567>>4的内存写照为:00000000 00000000 00111001 01000100

同时,在Java中,有-11>>31=-1(即:11111111111111111111111111111111),由此可知,Java编译器对有符号数的处理方法不一样,右移(>>)高位补符号位(算术右移)

 

(2)左移(<<)

将操作符左边的数向左移动指定的位数

现在内存中234567<<4的内存写照为:00000000 00111001 01000100 01110000

 

(3)java中number & 0xff什么解释?

&是“与”运算,如果对应的两个bit都是1,则那个bit的结果为1,否则为0;比如 1010 & 1101 = 1000(二进制)

0xff是十六进制形式,转换为二进制就是1111 1111,由于0xff的低8位是1,因此number中低8位&之后,如果原来是1,结果位还是1,如果原来是0,结果位还是0,高于8位的,0xff都是0,所以无论原来是0还是1,结果位都是0;所以,如果number为0xabcd,那么number & 0xff = 0xabcd  & 0x00ff=0x00cd = 0xcd

 

参考资料

优秀程序员不得不知道的20个位运算技巧


 

网络序字节序

计算机内存由正整数地址引用。

在计算机内存中存储数字时,最低有效字节排在最高有效字节之前,这是很自然的。

 

有时,计算机设计者喜欢使用这种表示的颠倒顺序版本。

 

在内存中,较低有效字节出现在较有效字节之前的自然顺序称为小端字节。

许多供应商,比如IBM、CRAY和Sun,当然更喜欢逆序,也就是所谓的大端排序。

在两台机器之间传输数据时,endian-ness的差异可能是一个问题。

Java二进制文件中的所有内容都以大端顺序存储。

这意味着如果你只使用Java,所有文件在所有平台上都以相同的方式完成,您可以自由地以电子方式交换二进制数据,而无需考虑任何端序性。 

posted @ 2015-06-29 11:06  时空穿越者  阅读(643)  评论(0编辑  收藏  举报