大致分为其中:按位或(I) 按位与( &) 按位异或(^) 按位取反(~) 左移(<<) 右移(>>) 无符号右移(>>>)
按位或(I)
有1则为1,无1则为0
- 1 | 0 = 1
- 1 | 1 = 1
- 0 | 0 = 0
按位与( &)
两个数都为1,则为1,否则为0
- 1 | 0 = 0
- 1 | 1 = 1
- 0 | 0 = 0
按位异或(^)
相同位不同则为1,相同则为0。
- 1 | 0 = 1
- 1 | 1 = 0
- 0 | 0 = 0
按位取反(~)
为单目运算,是针对数字本身进行按位取反,1变0,0变1
- 1 = 0
- 0 = 1
左移(<<)
是将一个二进制数,全部向左平移X位
eg: 将0X23(十六进制数)左移两位
0X23 = 0010 0011 左移两位就是 1000 1100 。(左移之后右边空出来的位置,全部补零,左边移出的部分忽略)
右移(>>)
和上面的左移刚好相反,(规则是向右移动X位,右边移出的部分忽略,左边空出来的位置,全部补零)
无符号右移(>>>)
无符号右移,忽略符号位,空位都以0补齐
机器数(最高位为符号位,0为正,1为负):
如:5 机器数为 0000 0101; -5机器数为 1000 0101
原码:和机器数一样。
反码:
正数:和原码一样
负数:除符号位以外,其余位都按位取反。
补码:
正数:和原码一样
负数:除符号位以外,在反码的基础上,加1
注意:在使用时,机器都是使用补码进行表示的。
原码:
正数的原码是
原码、反码、补码的概念:
http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
重要须知:java虚拟机在表示整数的时候(java都是有符号数,没有无符号的概念),使用补码来进行表示;浮点数使用的是IEEE 754 标准(IEEE 二进制浮点数算术标准);字符串都用的是Unicode字符集和UTF-8编码。
-------------------------------------下面为自己理解---------------------------------------------------------------------------
大端(big endian):低地址存放高有效字节
小端(little endian):低地址存放低有效字节
通用原则:低索引位存储的是低位值,高索引位存储的是高位值??????是否正确
java采用的大端【低内存地址-->高内存地址,高位字节排列在低内存地址,所以数据在内存地址排列是如下的格式(byte[3],byte[2],byte[1],byte[0]),刚好是数据的大小顺序】
现在主流的CPU,intel系列的是采用的little endian的格式存放数据。网络编程中,TCP/IP统一采用大端方式传送数据,所以有时我们也会把大端方式称之为网络字节序
注意:
int之类的,低字节位数存放的是低位数据,高字节位数存放的是高位数据。
如
int a = 12;
十六进制表示为: 00 00 00 0C
二进制表示为: 00000000 00000000 00000000 00001100
需要四个字节表示int类型,byte[0],byte[1],byte[2],byte[3]
存放规则:
byte[0] = 00001100
byte[1] = 00000000
byte[2] = 00000000
byte[3] = 00000000
int b = 5123
十六进制表示为 0x00 00 14 03
二进制标示为:00000000 00000000 00010100 00000011
需要四个字节表示int类型,byte[0],byte[1],byte[2],byte[3]
存放规则:
byte[0] = 00000011
byte[1] = 00010100
byte[2] = 00000000
byte[3] = 00000000
移位操作只是为了将目标byte[]移动到最低位,然后强转为byte,并赋值给对应的byte[]
大端小端只是指这个字节是按照从小到大、还是从大到小这样的顺序排列
long/int <--> byte[]
public static byte[] getBytes(int data) { byte[] bytes = new byte[4]; bytes[0] = (byte) (0XFF & data); bytes[1] = (byte) ((0XFF00 & data) >> 8); bytes[2] = (byte) ((0XFF0000 & data) >> 16); bytes[3] = (byte) ((0XFF000000 & data) >> 24); return bytes; } public static int getInt(byte[] bytes) { return (0XFF & bytes[0]) | (0XFF00 & (bytes[1] << 8)) | (0XFF0000 & (bytes[2] << 16)) | (0XFF000000 & (bytes[3] << 24)); } public static byte[] getBytes(long data) { byte[] bytes = new byte[8]; bytes[0] = (byte) (data & 0xff); bytes[1] = (byte) ((data >> 8) & 0xff); bytes[2] = (byte) ((data >> 16) & 0xff); bytes[3] = (byte) ((data >> 24) & 0xff); bytes[4] = (byte) ((data >> 32) & 0xff); bytes[5] = (byte) ((data >> 40) & 0xff); bytes[6] = (byte) ((data >> 48) & 0xff); bytes[7] = (byte) ((data >> 56) & 0xff); return bytes; } public static long getLong(byte[] bytes) { return (0xffL & (long) bytes[0]) | (0xff00L & ((long) bytes[1] << 8)) | (0xff0000L & ((long) bytes[2] << 16)) | (0xff000000L & ((long) bytes[3] << 24)) | (0xff00000000L & ((long) bytes[4] << 32)) | (0xff0000000000L & ((long) bytes[5] << 40)) | (0xff000000000000L & ((long) bytes[6] << 48)) | (0xff00000000000000L & ((long) bytes[7] << 56)); } public static byte[] getBytes(double data) { long l = Double.doubleToLongBits(data); return getBytes(l); } public static double getDouble(byte[] data) { long l = getLong(data); return Double.longBitsToDouble(l); }
下面是Netty源码的写法:
/** * 大端: 低位放高位地址 * &(与): 1 & 1=1; 1&0 =0 用1可以保证对应位置不变 * |(或): 0 | 0=0; 0|1=1 用0可以保证对应位置不变 * >> / << / >>> 左右移动N位 */ public static byte[] setInt(int value) { byte[] memory = new byte[4]; memory[0] = (byte) (value >>> 24); memory[1] = (byte) (value >>> 16); memory[2] = (byte) (value >>> 8); memory[3] = (byte) value; return memory; } public static int getInt(byte[] memory) { return (memory[0] & 0xff) << 24 | (memory[1] & 0xff) << 16 | (memory[2] & 0xff) << 8 | memory[3] & 0xff; }
相关推荐
### 二、常用的位运算操作符 #### 1. 与(&) 与运算符是一个二元操作符,用于比较两个数对应位上的二进制数字。当两个相应的位都为1时,结果位为1;否则结果位为0。例如: ``` 1010 & 1100 = 1000 ``` #### 2. ...
1. **XOR64(异或)**:在64位环境中,XOR操作符用于对两个数的每一位进行异或操作。如果对应位相同,则结果为0;如果对应位不同,则结果为1。异或常用于加密算法中,因为它的性质使得原始数据和异或后的数据可以...
位运算通常操作无符号数,它的基本操作符包括位与(&)、位或(|)、位非(~)、位异或(^)、左移()和右移(>>)。这些操作符在编程语言中都是二元操作符,即一次操作两个操作数。 位与(&)运算符,如果两个相应位都为1,则...
VHDL中的数据对象、数据类型和运算操作符是构建电路模型的基础。 首先,VHDL中的数据对象主要包括四种类型:信号(Signal)、变量(Variable)、常数(Constant)和文件(File)。信号是VHDL中最核心的数据对象,它...
C++还支持位运算赋值操作符,如`&=`, `|=`, `^=`, `, `>>=`。它们等价于先进行相应的位运算,然后将结果赋给左边的操作数。 ```cpp #include int main() { int a = 3; int b = 4; a &= b; // 等同于 a = a & b...
C语言中的位运算是一种底层操作,它涉及到对数据的二进制表示进行直接操作。位运算符主要包括与(&)、或(|)、异或(^)、取反(~)、左移()和右移(>>). 这些运算符在计算机科学中有着广泛的应用,尤其是在硬件控制、数据...
位运算(Bitwise Operators)是计算机科学中的一个基础概念,它直接作用于二进制位上。在Java语言中,位运算符可以应用于所有整型数据类型,如`long`、`int`、`short`、`char`和`byte`。位运算在很多场景下非常有用...
位运算在计算机科学中扮演着重要的角色,尤其是在底层数据处理和优化算法中。位运算符包括与(&), 或(|), 异或(^), 取反(~), 左移()和右移(>>)。这些操作符直接作用于二进制数的每一位,由于它们直接在硬件级别执行,...
- **特殊应用**:按位或运算符常用于将原操作数的某些位设置为1,其余位保持不变。例如,若想将一个数`s`的低8位设置为1,可以将`s`与255(即二进制`0000000011111111`)进行按位或运算。 **3. 按位异或运算符`^`**...
位运算不仅限于这些基本操作,还有如`&=`、`^=`、`|=`、`和`>>=`这样的复合赋值操作符,它们分别对应于按位与、按位异或、按位或、左移和右移后的赋值。 在实际应用中,位运算常常用于: 1. 不使用临时变量交换两个...
Java位运算是一种在计算机科学中广泛使用的操作,它涉及到对二进制位的直接操作,包括按位与、按位或、按位异或、按位非、左移、右移以及无符号右移等。这些操作对于理解底层计算原理、优化代码性能以及在特定场景下...
本篇文章将深入探讨Java中的位运算,包括其基本概念、常用操作符以及实际应用。 一、位运算的基本概念 在计算机内部,所有的数据都是以二进制形式存储的。位运算就是对这些二进制位进行操作。一个整数在计算机内存...
使用按位或操作符可以确保某个位被设置为1,而其他位保持不变。例如,`BYTE b = 50; BYTE c = b | 0x04;`将确保b的第3位被设置为1,结果存储在c中。 #### 按位异或(^)操作符 - **翻转某一位**:通过与1进行按位...
位运算是指直接对组成存储单元的数据位进行操作的指令或运算。位运算符通常用于低级别的程序设计中,如设备驱动程序、嵌入式系统编程等场景。在C语言中,位运算符包括按位与(&)、按位或(|)、按位异或(^)、左移()、...
其次,位运算在计算机科学中扮演着基础角色,C++提供了与位相关的操作符,包括按位与(&),按位或(|),按位异或(^),按位非(~),左移()和右移(>>). 这些运算是底层数据处理的关键,特别是在嵌入式系统和硬件接口编程...
按位或操作符"|"用于将两个二进制数的对应位进行逻辑或运算,即只要其中一个位为1,结果位就为1。在例子中,2|3的结果为3,这是因为2和3的二进制表示中至少有一位为1。 #### 按位异或(^) 按位异或操作符"^"用于...
这些操作符直接作用于二进制数的每一位,由于它们直接在硬件级别操作,所以执行速度极快。 一、位运算基础 1. 与(&)运算:当两个位都是1时,结果为1;否则为0。常用于设置或清除特定位。 2. 或(|)运算:当两个位都...
- 例如,使用按位与操作符可以检查一个特定位是否被设置。 2. **位集合** - 通过位运算可以实现高效的数据存储,如位集合。 - 在某些情况下,使用位运算存储大量布尔值数据比传统的数组更加节省空间。 3. **...
在C语言程序中,涉及到的运算操作符包括+、-、*、/、&、|、~、^等。这些操作符可以实现各种运算操作,如整数算术运算、浮点数算术运算、按位运算、逻辑运算等。 此外,本章节还讨论了移位运算、位扩展运算和位截断...
这些运算在很多编程语言中都有相应的操作符来实现。掌握位运算技巧对于进行底层编程,尤其是系统编程、嵌入式开发等,是非常重要的。位运算通常比普通算术运算更加快速高效,因此在一些对性能要求较高的场合非常有用...