Java中符号位扩展】的更多相关文章

第一个例子: byte b=-100;b在内存中是以补码的形式存贮的:1001 1100 如果执行char c=(char)b;如3楼企鹅先生所说:b要先变为int,这时增加的位全要用b的符号位填充(这就是符号扩展),变为:1111 1111 1111 1111 1111 1111 1001 1100 下步是强制类型转换,只保留了最低的两个字节:1111 1111 1001 1100. 如果执行char c=(char)(b&0xff),同样b要转为int ,同时符号位扩展:1111 1111 …
今天,魏屌出了一道题,题目如下: 定义一个大头序的byte[]a={-1,-2,-3,-4},转换成short[]b.问b[0]和b[1]分别是多少? 乍一看,这题不难,无非就是移位操作,再进行组合.但是呢?对于用Java的童鞋来说,这里面有一个坑,稍不注意可能就踩进去了.在说之前,我先把代码和答案贴出来吧. 看到这里,可能有的童鞋比较奇怪,为啥要&0xff,这不相当于没变化吗?非也,不信我举个例子. 答案是-127和129.很奇怪不是吗?我想的明明都是-127啊!!! 解答这个问题之前,我们先…
目录 JDK源码的使用 日常工作中的使用 JDK源码的使用 最近在JDK源码中闲逛,无意中看到了java.lang.reflect.Modifier这个类,这个类很简单,都是些常量定义和判断方法,于是扒了扒代码实现的含义,我们就看个isPublic方法吧: /** * Return {@code true} if the integer argument includes the * {@code public} modifier, {@code false} otherwise. * * @p…
类型取值范围 short 是1字节,即8位.而且 Java 中只有有符号数,所以最大值 0111,1111=2^7-1. 同时计算机中以补码形式存负数,所以可以多表示一个数,则最小值 1000,0000=-2^7=-128. [因为原码中有 +0 -0,所以反码也一样] 图源 那么如果我传入的 byte 超过最大值 127 呢? byte a = (byte)234; System.out.println(a); // 输出-22 234原码: 11101010,因为 byte 高位为符号位,所…
版权声明:本文为博主原创文章,未经博主允许不得转载. 首先,介绍一下两种扩展的定义 转 http://blog.csdn.net/jaylong35/article/details/6160736 符号扩展:当用更多的内存存储某一个有符号数时,由于符号位位于该数的第一位,扩展之后,符号位仍然需要位于第一位,所以,当扩展一个负数的时候需要将扩展的高位全赋为1.对于正数而言,符号扩展和零扩展是一样的,因为符号位就是0. 比如一个用一个8位二进制表示-1,则是10000001 如果把这个书用16位二进…
以下内容转自 艾米电子 - 使用有符号数,Verilog(http://www.cnblogs.com/yuphone/archive/2010/12/12/1903647.html) Verilog-1995中的有符号数 在Verilog-1995中,只有integer数据类型被转移成有符号数,而reg和wire数据类型则被转移成无符号数.由于integer类型有固定的32位宽,因此它不太灵活.我们通常使用手动加上扩展位来实现有符号数运算.下面的代码片段将描述有符号数和无符号数的运算: :]…
一 参考博文 java中无符号类型的解决方案 二 java中的无符号数和有符号数 在计算机中,可以区分正负的类型,称为有符号类型,无正负的类型,称为无符号类型. 使用二进制中的最高位表示正负 计算机中一般用补码表示数值:另外,用二进制的最高位表示符号,0表示正数.1表示负数. 无符号和有符号数的范围的区别 无符号数中,所有的位都用于直接表示该值的大小:有符号数中最高位用于表示正负,所以,正值时,该数的最大值就会变小: 无符号数:1111 1111 值:255 有符号数:0111 1111 值:1…
一.位运算 Java中有4个位运算,它们的运算规则如下: (1)按位与 (&)  :两位全为1,结果为1,否则为0: (2)按位或  (|)   :两位有一个为1,结果为1,否则为0: (3)按位取反(~):0 变 1, 1变0: (4)按位异或(^):两位,如果相同,结果为0:如果不同,结果为1: 注意:      (1)位运算中的 符号位(最高位)也跟着变; (2)位运算符与逻辑运算符(逻辑与&&.逻辑或||.逻辑非! )有点相似.但是,逻辑运算符只能操作boolean变量  …
从一个例子说起: int main(void){ union{ int i; struct{ ; ; ; }bits; }num; printf("Input an integer for i(0~15): "); scanf("%d", &num.i); printf("i = %d, cba = %d %d %d\n", num.i, num.bits.c, num.bits.b, num.bits.a); ; } 输入i值为11,则…
众所周知,计算机底层是二进制.而java作为一门计算机编程语言,也对二进制的位运算提供了完整的支持. 在java中,int是32位的,也就是说可以用来实现32位的位运算.方便起见,我们一般用16进制对它赋值,比如: 0011表示成16进制是 0x3, 110111表示成16进制是 0x37. 那么什么是位运算呢?位运算是将数据看做二进制,进行位级别的操作.主要有移位运算和逻辑运算 移位运算: 左移:操作符为<<,向左移动,右边的低位补0,左边高位舍弃,将二进制看做整数,左移1位就相当于乘以2.…
一.& 按位与运算符 5 & 3 = 1 5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101 3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011 规则:对应的两个二进制位都为1时,结果位就为1,其他情况都为0. 1 & 1 = 1 1 & 0 = 0 0 & 1 = 0 0 & 0 = 0 二.| 按位或运算符 5 | 3 = 7 5转换为二进制:0000 0000 00…
Java提供的位运算符有:左移( << ).右移( >> ) .无符号右移( >>> ) .位与( & ) .位或( | ).位非( ~ ).位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符. PS:所有的位运算操作都是基于二进制补码进行的,干开发的都应该知道相关知识吧,我就不多哔哔. 在移位运算时,byte.short和char类型移位后的结果会变成int类型,对于byte.short.char和int进行移位时,规定实际移动的次…
为了方便对二进制位进行操作,Java给我们提供了以下四个二进制位操作符: &    按位与 |     按位或 ^    按位异或 ~    按位取反 Java中有三个移位运算符: 左移:<<                        丢弃最高位,0补最低位:num << 1,相当于num乘以2 带符号右移:>>               符号位不变,左边补上符号位:num >> 1,相当于num除以2 无符号右移:>>>  …
位运算的效率是最高的,因为位位运算是直接对二进制进行操作 位运算只能应用于整型和char类型(char类型可以看做是特殊的无符号的整形) 面试题: a: 判断一个数是否是奇数 a & 1 == 1; b: 对2 ^ n 取余. a & (2^n - 1); c: 如何判断一个数是否是2^n a & (a-1) == 0: d: 两个整数之间的交换: e: 用最有效率的方式求2 * 8的值 2 << 3; a: 判断一个数是否是奇数 a & 1 == 1; /*…
在某技术群看到这样的一个面试题目: 这是一个4年经验的java 从业者的答案. 你的答案是什么呢? 正确的答案是true. 为什么? 其实当使用String a="a"+"b"+1;时,程序会建立一个String缓冲池(String pool):把a放入:当再次使用Stirng b="ab1";程序首先会在这个String缓冲池中寻找相同值的对象;找到了a,然后a,b引用了相同的值的对象. 我们可以查找到很多相关与String pool的资料.…
昨天去面试的时候做到了一道Java的位运算题目,发现有个运算符不懂:">>>",今天特地查了一下,并小结一下常见的位运算符号: ~  按位非(NOT)(一元运算) &  按位与(AND) |  按位或(OR) ^  按位异或(XOR) >>  右移 >>>  右移,左边空出的位以0填充 :无符号右移 <<  左移 &=  按位与赋值 |=  按位或赋值 ^=  按位异或赋值 >>=  右移赋值 &g…
参考连接:https://www.jianshu.com/p/3a3edbcd8f24 一.什么是SPI SPI ,全称为 Service Provider Interface,是一种服务发现机制.它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类. 二.设计的目的 肯定是为了扩展性,在不想修改源码的情况下,去替换系统原有的实现,代价最小也最灵活. 三.案例demo 先看看目录接结构 spi-api模块:定义扩展接口 spi-client…
1.后缀名.dic的词典文件,必须如使用文档里所说的 无BOM的UTF-8编码保存的文件.如果不确定什么是 无BOM的UTF-8编码,最简单的方式就是 用Notepad++编辑器打开,Encoding->选择 Encoding in UTF-8 without BOM,然后保存.2.项目preferences 里 编码选择 utf8.3.词典和IKAnalyzer.cfg.xml配置文件的路径问题.IKAnalyzer.cfg.xml必须在src根目录下.文件前面一定不要加/,否则是绝对路径找不…
通过 <<  |  & ~ 位运算,实现同时拥有多个状态 通过 << 定义数据的状态 public interface LogConstants { /** * 消耗标记 */ short COST_ASSET = 1 << 0; short COST_GOLD = 1 << 1; short COST_BINDGOLD = 1 << 2; short COST_SOPH = 1 << 3; short COST_STRSOU…
public class Demo { public static void main(String[] args) { byte num1 = 3; byte num2 = 5; /*位预算 *num1        0011 *左移2位      1100 *右移2位      0000 */ System.out.println("左移2位 " +(num1<<2)); System.out.println("右移2位 " +(num1>&g…
先预知识: 数据在计算机中是以二进制的形式进行存储的,而二进制在内存中是以补码的形式进行存储的.在介绍位运算之前,首先来看一下原码.反码和补码的概念.由于正数的原码.反码和补码的形式都是一样的,所以以下主要针对负数进行讲解. 原码:在数值前直接加一符号位的表示法. 反码:原码的数值位取反(0变1,1变0). 补码:原码加1. PS:已知补码,求原码. 分析:按照求负数补码的逆过程,可以采取补码减1再取反的思路.但是对于二进制来说,减1取反和取反加1的效果是一样的.所以仍然可以采用取反加1的方法来…
byte b = -127; System.out.println(b); // -127 int b1 = b & 0xff; System.out.println(b1); // 129 b的二进制表示为:10000001 (1)符号位扩展: 11111111 11111111 11111111 10000001 = -127 (2)补零扩展: b&0xff为11111111 11111111 11111111 10000001              &   1111111…
java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >> 1,相当于num除以2 >>>    :     无符号右移,忽略符号位,空位都以0补齐 下面来看看这些移位运算都是怎样使用的 /** 2 * 3 */ package com.b510.test; /** 7 * @author Jone Hongten 8 * @create d…
java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >> 1,相当于num除以2 >>>    :     无符号右移,忽略符号位,空位都以0补齐 下面来看看这些移位运算都是怎样使用的 1 /** 2 * 3 */ 4 package com.b510.test; 5 6 /** 7 * @author Jone Hongten 8 * @…
java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >> 1,相当于num除以2 >>>    :     无符号右移,忽略符号位,空位都以0补齐 下面来看看这些移位运算都是怎样使用的 public class MoveOperation { public static void main(String[] args) { int numb…
java移位运算符:<<(左移).>>(带符号右移)和>>>(无符号右移). 1. 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数. 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数. 左移的规则只记住一点:丢弃最高位,0补最低位 如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模.如对int型移动33位,实际上只移动了332=1位. 2)运算规则 按二进制形式把所…
基础不牢,地动山摇.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BAT的乌托邦]逐个击破,深入掌握,拒绝浅尝辄止. 目录 ✍前言 ✍正文 二进制 二进制与编码 Java中的二进制 便捷的进制转换API 如何证明Long是64位的? Java中的位运算 简单运算 &:按位与 |:按位或 ~:按位非 ^:按位异或 >>:按位右移 >>>:无符号右移…
Java 中>>和>>>的区别 Java中的位运算符: >>表示右移,如果该数为正,则高位补0,若为负数,则高位补1: >>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0. 表达式为: result = exp1 >> exp2; result = exp2 >>> exp2; 表示把数exp1向右移动exp2位. 例如: res = 20 >> 2;  2…
位运算指的是针对整数的二进制进行的位移操作. 位运算提供比算术运算更高的效率,但是位运算的代码可读性较差,建议所有使用位运算的地方写上注释. Java中提供7个位运算符用于位运算. 左移(<<) 左移运算是将操作数二进制值逐位左移若干位,左移过程中符号位不变,高位溢出则舍弃,低位则补0. 范例 结果 范例 结果 00000001<<2 00000100 10000001<<2 10000100 01100001<<2 00000100 11100001<…
「WTF系列」深入Java中的位操作 关于WTF系列 引 学完本章节你将学会位的基础概念与语法,并且还会一些骚操作!! 与.或.非.位移 原码.反码.补码 字节.位.超区间...... 开始本章节之前,我们先思考一个问题: byte a = 33; byte b = -3; 若我们输出a.b的二进制字符串是多少? 答案是这样的么? a->// 00100001 b->// 10100001 当然同学们可能会觉得我既然问了就肯定不是这样:是吧-别着急你们试试就知道了. 在Java中输出一个值对应…