一、初识位运算

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

扩展:进制转换

  此处简单提一下进制转换: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

参考资料

(1)http://nassir.iteye.com/blog/1994914

(2)一个算法题引出的异或运算律

http://blog.virtao.org/articles/163.html

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

http://www.cnblogs.com/qiaogaojian/p/5873105.html


网络序字节序

http://www.cnblogs.com/jacktu/archive/2008/11/24/1339789.html

http://blog.chinaunix.net/uid-12782-id-2915864.html


直接摘抄过来 http://blog.163.com/tfn2008@yeah/blog/static/11032131920131211310727/

在Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换。

方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对Stream中的数据以Unsigned读取。

Java在这方面提供了支持,可以用java.io.DataInputStream类对象来完成对流内数据的Unsigned读取,该类提供了如下方法:
(1)int   readUnsignedByte()    //从流中读取一个0~255(0xFF)的单字节数据,并以int数据类型的数据返回。返回的数据相当于C/C++语言中所谓的“BYTE”。
(2)int readUnsignedShort()   //从流中读取一个0~65535(0xFFFF)的双字节数据,并以int数据类型的数据返回。返回的数据相当于C/C++语言中所谓的“WORD”, 并且是以“低地址低字节”的方式返回的,所以程序员不需要额外的转换。

方案二:利用Java位运算符,完成Unsigned转换。

正常情况下,Java提供的数据类型是有符号signed类型的,可以通过位运算的方式得到它们相对应的无符号值,参见几个方法中的代码:

public int getUnsignedByte (byte data){      //将data字节型数据转换为0~255 (0xFF 即BYTE)。
return data&0x0FF;
}

public int getUnsignedByte (short data){      //将data字节型数据转换为0~65535 (0xFFFF 即 WORD)。
return data&0x0FFFF;
}

public long getUnsignedIntt (int data){     //将int数据转换为0~4294967295 (0xFFFFFFFF即DWORD)。
return data&0x0FFFFFFFFl;
}

位运算 & 网络序字节序的更多相关文章

  1. Linux网络编程--字节序

    1 .谈到字节序,那么会有朋友问什么是字节序 非常easy:[比如一个16位的整数.由2个字节组成,8位为一字节,有的系统会将高字节放在内存低的地址上,有的则将低字节放在内存高的地址上,所以存在字节序 ...

  2. C语言字节对齐问题详解(对齐、字节序、网络序等)

    首先说明一下,本文是转载自: http://www.cnblogs.com/clover-toeic/p/3853132.html 博客园用的少,不知道怎么发布转载文章,只能暂时这样了. 引言 考虑下 ...

  3. Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)

    IPv4套接字地址结构 struct sockaddr_in { uint8_t sinlen;(4个字节) sa_family_t sin_family;(4个字节) in_port_t sin_p ...

  4. linux网路编程:字节序(大端、小端、网络、主机)

    字节序:就是数据在内存中的存放顺序,也可称之为端模式. 大端模式和小端模式的定义 1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端. 2) Big-End ...

  5. UNIX网络编程——socket概述和字节序、地址转换函数

    一.什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口.socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信. socket API是一层抽象的网络 ...

  6. linux程序设计——主机字节序和网络字节序(第十五章)

    15.2.10    主机字节序和网络字节序 当在基于intel处理器的linux机器上执行新版本号的server和客户程序时,能够用netstat命令查看网络连接状况.它显示了客户/server连接 ...

  7. socket概述和字节序、地址转换函数

    一.什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口. socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信. socket API是一层抽象的网 ...

  8. 字节序:Big Endian 和 Little Endian

    一.字节序 字节序,也就是字节的顺序,指的是多字节的数据在内存中的存放顺序. 在几乎所有的机器上,多字节对象都被存储为连续的字节序列.例如:如果C/C++中的一个int型变量 a 的起始地址是& ...

  9. 【MINA】字节序知识

    字节序,分为高位在前和低位在前,说白了就是先从低操作还是从高位操作 java和网络的字节序是一致的,都是高位在前,这意味着java端序列化和反序列化时不用关心字节序的问题, 那问题是,那讨论字节序有什 ...

随机推荐

  1. 记一次MySQL手工注入

    本来想找个装安全狗的站试下绕过,safe dog没找到,但随便一搜搜到一个小站有SQLi,正好借此机会复习下手工注入(新版Firefox我吐槽一下,hackbar这么好用的工具,说阉割就阉割,哎) 小 ...

  2. Zookeep启动异常:Error contacting service. It is probably not running.

    异常提示: [root@hadoop bin]# ./zkServer.sh status JMX enabled by default Using config: /usr/local/zk/bin ...

  3. 【Openjudge 9277 Logs Stacking堆木头】 题解

    题目链接:http://noi.openjudge.cn/ch0206/9277/ ... #include <algorithm> #include <iostream> # ...

  4. data-ng-hide 指令

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  5. golang-Tag

    Tag 理解 Golang中可以对struct定义Tag 例如: type TestTag struct{ UserName string `json:"name"` Age In ...

  6. git使用过程的问题与解决办法

    一.什么是Git Git是目前世界上最先进的分布式版本控制系统.工作原理 / 流程: Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote ...

  7. iOS之查看代码运行的时间

    有时候我们想要准确的知道某段代码.某个循环执行的时间,然后分析效率等问题,这个时候就需要执行时间是多少.正好看到网上已经有人做了这个工作,我就直接摘下来了.正好也用了宏的方式计算时间,我们只要在需要计 ...

  8. 节约内存:Instagram的Redis实践

    Instagram可以说是网拍App的始祖级应用,也是当前最火热的拍照App之一,Instagram的照片数量已经达到3亿,而在Instagram里,我们需要知道每一张照片的作者是谁,下面就是Inst ...

  9. Web前端几种常见的实现水平垂直居中的方法

    第一种: 父容器不设置宽度,用定位实现水平垂直居中. <!DOCTYPE html> <html lang="en"> <head> <m ...

  10. [POI2008]MAF-Mafia(图论,贪心)

    题目描述 Mob feud rages in Equatorial Byteotia. The mob bosses have come to the country's capital, Byteb ...