大致分为其中:按位或(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; }
相关推荐
数字逻辑电路 VHDL数据对象、数据类型和运算操作符.docx 学习资料 复习资料 教学资源
本次实验的主要操作方式为:使用C语言的位操作符实现题目要求。 完成实验后提交给老师时,将自己编写的bits.c改名为“bits_学号”的形式交给学委统一收集。文件名例:bits_18210320101.c。如果文件名出现错误,则...
二进制杂谈 1、十进制、二进制、十六进制 2、计算机储存单位 3、进制转换 4、有符号编码 5、反码的设计原理 6、二进制的位运算 7、位操作符 8、内存与内存地址 9、字节序 10、Java解码 11、Java编码
移位运算又叫移位操作, 对计算机来说, 有很大的实用价值, 例如, 当计算机没有乘 (除) 运算线路时,可以采用移位和加法相结合,实现乘(除)运算。 计算机中机器数的字长往往是固定的,当机器数左移n位或右移n...
许多人认为浮点运算是一个深奥的主题。这相当令人吃惊,因为浮点在计算机系统中是遍存在的。几乎每种语言都有浮点数据类型;... G.1.0 [ 数值分析 ]:概论 — 计算机运算,错误分析,数值算法 (次要)。
逆波兰式通过将操作符放在操作数的后面来表示数学运算的顺序,避免了使用括号来确定运算的优先级。在实现程序过程中,关键是使用栈辅助转换中缀表达式为后缀表达式。在遍历中缀表达式的过程中,当遇到操作数时,直接...
即事先编写程序,再由计算机把这些信息 存储起来,然后连续地、快速地执行程序,从而完成各种运算过程。 2.采用数字化方法表示信息有哪些优点? 用数字化方法表示信息的优点: (1)抗干扰能力强, 可靠性高。 (2)...
十进制程序 参考答案:B 问题解析:计算机采用机器语言(二进制代码方式)和汇编语言(助记符)方式设计程序。 7.(单选题) 计算机能够直接识别和处理的语言是( )。 A. 汇编语言 B. 自然语言 C. 机器语言 D. 高级...
要求以字符序列的形式从终端输入语法正确的、不含变量的整数表达式,利用给定的算术符优先关系,实现对算数四则混合运算表达式的求值,并演示在求值过程中运算符栈、操作符栈、输入字符和主要操作的变化过程。
按位与或非是对计算机位的操作,属于计算机二进制运算的操作。——位操作符 逻辑与或非是对boolean(布尔)值的操作。——布尔操作符 操作符: 按位 与(&) 或(|) 非(~). 逻辑 与(&&) 或(||) 非(!) ...
1 目录 课程设计任务书 1 1.设计目的及设计原理 2 1.1设计目的 2 1.2设计原理 3 2.模型机的逻辑框图 3 3.指令系统及其指令格式 4 ... 指令系统如下表: 指令助记符 指令功能 指令编码 微周期 微操作 取指微指令 T0 PC
计算机指令由操作码与地址符组成。 10.一条指令单执行通常可分为以下一个基本操作:取出指令,分析指令,执行指令,和 形成下一条指令的地址。 11.计算机工作的过程实际就是执行程序的过程。 12.计算机的主机是有...
提示:可使用两组命令按钮控件数组分别用来输入操作数和操作符。作业要求:请参考windows计算器功能,根据自己的情况实现下面部分或全部功能,也可以发挥。 (1)可以利用上一步的运算结果 (2)可以在不点击“=”的...
2.补码加减法是指( )。 A. 操作数用补码表示,两数尾数相加减,符号位单独处理,减法用加法代替; B. 操作数用补码表示,符号位与尾数一起参加... 操作数用补码表示,由数符决定两尾数的操作,符号位单独处理。
报告,代码实验组成原理实验指导书流水线代码2CSDN多周期代码设计一个单周期CPU,该CPU至少能实现以下指令功能操作。指令与格式如下: ==> 算术运算指令 1. add rd , rs, rt (说明:以助记符表示,是汇编指令;以...
计算机中的运算器,具有 运算和 运算的能力。 7.根据存储器的功能或工作方式,可分为 和 两大局部。 8.按存储器是否直接与CPU交换信息,可分为 和 两类。 9.单张光盘盘片的存储容量可达 ,它的速度用倍速来表示,...
中缀表示法(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4)。也就是我们最常用的算术表达式,中缀表达式对于人类来说比较容易理解,但是不易于计算机解析。 ...
操作系统科学计算、数据处理、工业控制、 文字处理、图形处理 第四代 1970-至今 大规模集成电路 数据库网络等各个领域 主要特点:运算速度快、精确度高、具有记忆与逻辑判断能力 6、 计算机的主要应用 科学计算:例如:...
研制一台性能如下的实验计算机: (1) 不使用外设。 (2) 运算器采用多累加器结构。 (3) 操作数寻址方式有:直接地址寻址立即数寻址.寄存器直接寻址 (4) 指令系统由如下8条指令组成: 指令编码 助记符 指令...
指令的集合 指令集 指令序列 程序 指令组成 操作码、操作数 直接执行、二进制、速度快 机器语言 助记符 汇编语言 符号化 汇编语言 高级语言代码 源程序 3V+C++ 面向对象 高级语言组成 面向对象、面向过程 高级语言...