`

计算机位运算操作符

阅读更多

 

 

大致分为其中:按位或(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;
    }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 42.8 KB
0
0
分享到:
评论

相关推荐

    位运算.docx位运算是一种针对二进制位进行操作的运算方式,常用于低级编程、系统级编程以及一些算法和数据结构中 位运算操作符通常

    ### 二、常用的位运算操作符 #### 1. 与(&) 与运算符是一个二元操作符,用于比较两个数对应位上的二进制数字。当两个相应的位都为1时,结果位为1;否则结果位为0。例如: ``` 1010 & 1100 = 1000 ``` #### 2. ...

    易语言汇编位运算

    1. **XOR64(异或)**:在64位环境中,XOR操作符用于对两个数的每一位进行异或操作。如果对应位相同,则结果为0;如果对应位不同,则结果为1。异或常用于加密算法中,因为它的性质使得原始数据和异或后的数据可以...

    位运算教程

    位运算通常操作无符号数,它的基本操作符包括位与(&)、位或(|)、位非(~)、位异或(^)、左移()和右移(&gt;&gt;)。这些操作符在编程语言中都是二元操作符,即一次操作两个操作数。 位与(&)运算符,如果两个相应位都为1,则...

    数字逻辑电路 VHDL数据对象、数据类型和运算操作符.docx

    VHDL中的数据对象、数据类型和运算操作符是构建电路模型的基础。 首先,VHDL中的数据对象主要包括四种类型:信号(Signal)、变量(Variable)、常数(Constant)和文件(File)。信号是VHDL中最核心的数据对象,它...

    C++位运算简介

    C++还支持位运算赋值操作符,如`&=`, `|=`, `^=`, `, `&gt;&gt;=`。它们等价于先进行相应的位运算,然后将结果赋给左边的操作数。 ```cpp #include int main() { int a = 3; int b = 4; a &= b; // 等同于 a = a & b...

    C语言位运算总结位操作基础基本的位操作符有与、或、异或、取反、左移、右移这6种,它们的运算规则如下.pdf

    C语言中的位运算是一种底层操作,它涉及到对数据的二进制表示进行直接操作。位运算符主要包括与(&)、或(|)、异或(^)、取反(~)、左移()和右移(&gt;&gt;). 这些运算符在计算机科学中有着广泛的应用,尤其是在硬件控制、数据...

    Java中的位运算

    位运算(Bitwise Operators)是计算机科学中的一个基础概念,它直接作用于二进制位上。在Java语言中,位运算符可以应用于所有整型数据类型,如`long`、`int`、`short`、`char`和`byte`。位运算在很多场景下非常有用...

    位运算的妙用

    位运算在计算机科学中扮演着重要的角色,尤其是在底层数据处理和优化算法中。位运算符包括与(&), 或(|), 异或(^), 取反(~), 左移()和右移(&gt;&gt;)。这些操作符直接作用于二进制数的每一位,由于它们直接在硬件级别执行,...

    基于位运算的两种字符串加密解密算法

    - **特殊应用**:按位或运算符常用于将原操作数的某些位设置为1,其余位保持不变。例如,若想将一个数`s`的低8位设置为1,可以将`s`与255(即二进制`0000000011111111`)进行按位或运算。 **3. 按位异或运算符`^`**...

    位运算及其应用实例.docx

    位运算不仅限于这些基本操作,还有如`&=`、`^=`、`|=`、`和`&gt;&gt;=`这样的复合赋值操作符,它们分别对应于按位与、按位异或、按位或、左移和右移后的赋值。 在实际应用中,位运算常常用于: 1. 不使用临时变量交换两个...

    java位运算

    Java位运算是一种在计算机科学中广泛使用的操作,它涉及到对二进制位的直接操作,包括按位与、按位或、按位异或、按位非、左移、右移以及无符号右移等。这些操作对于理解底层计算原理、优化代码性能以及在特定场景下...

    java位运算,符号运算 详细解释

    本篇文章将深入探讨Java中的位运算,包括其基本概念、常用操作符以及实际应用。 一、位运算的基本概念 在计算机内部,所有的数据都是以二进制形式存储的。位运算就是对这些二进制位进行操作。一个整数在计算机内存...

    c语言 重要的位运算

    使用按位或操作符可以确保某个位被设置为1,而其他位保持不变。例如,`BYTE b = 50; BYTE c = b | 0x04;`将确保b的第3位被设置为1,结果存储在c中。 #### 按位异或(^)操作符 - **翻转某一位**:通过与1进行按位...

    ASCII码 C语言位运算优先级.txt

    位运算是指直接对组成存储单元的数据位进行操作的指令或运算。位运算符通常用于低级别的程序设计中,如设备驱动程序、嵌入式系统编程等场景。在C语言中,位运算符包括按位与(&)、按位或(|)、按位异或(^)、左移()、...

    详解了C++中的模板,位运算,虚函数表 方面的东西

    其次,位运算在计算机科学中扮演着基础角色,C++提供了与位相关的操作符,包括按位与(&),按位或(|),按位异或(^),按位非(~),左移()和右移(&gt;&gt;). 这些运算是底层数据处理的关键,特别是在嵌入式系统和硬件接口编程...

    韩顺平位运算

    按位或操作符"|"用于将两个二进制数的对应位进行逻辑或运算,即只要其中一个位为1,结果位就为1。在例子中,2|3的结果为3,这是因为2和3的二进制表示中至少有一位为1。 #### 按位异或(^) 按位异或操作符"^"用于...

    位运算.docx

    这些操作符直接作用于二进制数的每一位,由于它们直接在硬件级别操作,所以执行速度极快。 一、位运算基础 1. 与(&)运算:当两个位都是1时,结果为1;否则为0。常用于设置或清除特定位。 2. 或(|)运算:当两个位都...

    位运算C语言.docx

    - 例如,使用按位与操作符可以检查一个特定位是否被设置。 2. **位集合** - 通过位运算可以实现高效的数据存储,如位集合。 - 在某些情况下,使用位运算存储大量布尔值数据比传统的数组更加节省空间。 3. **...

    第三章 运算方法和运算部件.ppt

    在C语言程序中,涉及到的运算操作符包括+、-、*、/、&、|、~、^等。这些操作符可以实现各种运算操作,如整数算术运算、浮点数算术运算、按位运算、逻辑运算等。 此外,本章节还讨论了移位运算、位扩展运算和位截断...

    关于位运算的一些技巧

    这些运算在很多编程语言中都有相应的操作符来实现。掌握位运算技巧对于进行底层编程,尤其是系统编程、嵌入式开发等,是非常重要的。位运算通常比普通算术运算更加快速高效,因此在一些对性能要求较高的场合非常有用...

Global site tag (gtag.js) - Google Analytics