右移运算符

信息的表示和处理(一)信息存储

依然范特西╮ 提交于 2020-03-08 11:42:38
信息存储 大多数计算机使用8位的块,或者字节(byte),作为最小的可寻址的内存单位,而不是访问内存中单独的位。机器级程序将内存视为一个非常大的字节数组,称为虚拟内存。内存的每个字节都由一个唯一的数字来标识,称为它的地址,所有可能地址的集合就称为虚拟地址空间。顾名思义,这个虚拟地址空间只是一个展现给机器级程序的概念性映像。实际的实现是将动态随机访问存储器(DRAM)、闪存、磁盘存储器、特殊硬件和操作系统软件结合起来,为程序提供一个看上去统一的字节数组。 十六进制表示法 一个字节由八位组成。在二进制表示法中,它的值域是0000 0000 2 ~1111 1111 2 。如果看成十进制整数,它的值域就是0 10 ~255 10 。两种符号表示法对描述位模式来说都不是非常方便。二进制法太冗长,而十进制表示法与位模式转化很麻烦。代替的方法时,以16位基数,或者叫做十六进制数,来表示位模式。十六进制(简写为“hex”)使用数字0~9以及字符A~F来表示十六个可能的值。图1-1展示了十六个十进制数字对应的十进制值和二进制值。用十六进制书写,一个字节的值域为00 16 ~FF 16 。 图1-1 十六进制法。每个十六进制数字都对十六个值中的一个进行了编码 在C语言中,以0x或0X开头的数字常量被认为是十六进制的值。字符A~F既可以大写也可以小写,甚至可以大小写混合。比如FA1D37B 16

Java千问:Java位运算经典应用(三)

守給你的承諾、 提交于 2020-03-02 10:47:33
接上篇 五、字符串加密 在很多场合下,都需要给字符串进行加密,使字符串由”明文”变成”密文”。对字符串加密有很多种算法,其实我们利用位运算也可以实现简单的加密效果。用位运算实现加密的原理很简单,这里为大家讲解一下。假设有两个整数a和b ,a^b的结果为c。我们可以认为a就是原始数据,a与b进行异或运算所得到的c就是加密后的数据,b在加密过程中扮演着”密钥”的角色。在不知道b值的情况下,如果只是知道c的值,任何人无法仅仅根据c的值反推出a的值,也就是说,如果我们只知道加密后的数据,而不知道密钥,根本无法确切得知原始数据a的值到底是多少。如果想根据加密后的数据c来还原初始数据a,就必须用密钥b来解密。解密的方法也很简单,只要进行c^b的操作就可以了。其原理就是”a^b^b=a”,在这个等式中,”a^b”的结果就是c,所以”c^b=a”。 理解了加密和解密的最基本原理之后,我们再来说说如何具体对字符串实施加密操作。我们知道,位运算符只能对byte、short、int、long和char这几种基础类型的数据进行运算,对字符串这种引用类型的数据并不适用。既然字符串无法进行位运算,那么该如何对字符串进行加密呢?我们知道,无论是图片还是文本,在计算机当中都是以二进制数的形式进行存储的。既然是二进制数,那么每8位的二进制数,都可以转换成一个byte类型的数据。而N个8位二进制

位运算

北城以北 提交于 2020-01-04 17:24:16
左移,右移 位运算 最近在用findbugs扫描代码中的规范问题时,看到了位运算的用处,记录一下 /** * 位运算 */ @Test public void testUnsignedOperateAverage ( ) { int beginIndex = 3 ; int endIndex = 5 ; int midIndex1 = ( beginIndex + endIndex ) / 2 ; System . out . println ( "两个数求平均值:" + midIndex1 ) ; System . out . println ( "使用左移操作得到的值:" + ( ( beginIndex + endIndex ) << 1 ) ) ; System . out . println ( "使用右移操作得到的值:" + ( ( beginIndex + endIndex ) >> 1 ) ) ; } 运行结果: ↓...start test...↓ 两个数求平均值:4 使用左移操作得到的值:16 使用右移操作得到的值:4 ↑...end test...↑ Process finished with exit code 0 重点: <<:左移运算符,number<<1,相当于number*2; >>:左移运算符,number>>1,相当于number/2; >>>

位移运算符

非 Y 不嫁゛ 提交于 2019-12-02 22:14:15
https://blog.csdn.net/qq_39736982/article/details/82897647 无符号位移(>>>、<<<)和有符号位移(>>、<<) 关于数的移位,特别需要注意: 1、正数,三码(源码、反码、补码)相同,所以无论左移还是右移都是补0.(左移则表示放大2的N次方,右移表示缩小2的N次方) 2、负数的补码就需要注意,左移在右边补0,右移需要在左边补1 有一个很有趣的误区是,认为符号位保持不变,仅仅移动数据位,这是不对的,因为无论数据位还是符号位,都是二进制,在整体大迁移的过程中,符号位也是要跟随潮流的。只不过,为了保证右移后,和原来的符号数一样,因此,负数在右移时左边补 计算机表示数字正负不是用+ -加减号来表示,而是用最高位数字来表示,0表示正,1表示负 1.有符号右移>>(若正数,高位补0,负数,高位补1) 正数:例如4>>2 首先写出4的二进制数,因为是正数所以最高位为0,也就是第一个 0000 0100 右移两位得到(高位补0) 0000 0001 结果为:1,右移n位也就是4/(2^n) 负数:例如-4>>2(高位补1) 首先写出-4的二进制数源码,因为是负数所以最高位为1 (负数的源码是负数的绝对值) 1000 0100 然后写出-4反码:保证符号位不变,其余位置取反 1111 1011(反码) 最后写出-4的补码:在反码的基础上加1

大数据学习笔记――Java篇

匿名 (未验证) 提交于 2019-12-02 21:52:03
Java / 计算机基础知识整理 在进行知识梳理同时也是个人的第一篇技术博客之前,首先祝贺一下,经历了一年左右的学习,从完完全全的计算机小白,现在终于可以做一些产出了!可以说也是颇为感慨,个人认为,学习本身就应该是有方法论的,前人总结了不少比较好的学习方法(比如说费曼学习法,金字塔原理),我们在进行好方法借鉴的同时,也不要忘了让整个学习过程形成一个闭环,我认为,向他人教学,或是定期将已有的知识进行一些梳理,总结,就是闭环的一种,这种方式在向他人传授知识的同时,更是对自己已有知识体系的一次查漏补缺。好了,废话不多说了,开始我们的行程了吧,第一次以这种方式进行分享,势必还有很多不够完善之处,我自己也会坚持博客的撰写,希望能够越写越好,技术进步的同时,也锻炼自己的文笔!(仪式感还是需要滴) 实际上,对于大数据技术本人已有一些应用场景了,特此开了自己的博客,将以往的知识点进行梳理: 1. Java发展历史及其语言概述 1946年2月,美国数学家冯 诺伊曼研发出了世界上第一台计算机,ENIAC,而这也标志着人类科技发展史上的一座伟大里程碑。不同于自然语言,计算机并听不懂人类所说的话,因此,计算机语言诞生了,计算机语言的发展史经历了机器码到汇编语言再到高级语言三个阶段,第一代的机器码完全就是01代码,而汇编语言则出现了一些简单的英文单词,第三代的高级语言更接近于人类语言,因此容易理解、记忆

Java 中int与byte数组转换详解

一笑奈何 提交于 2019-12-02 16:28:18
1、与运算符的理解(&): 参加运算的两个数据,按二进位进行“与”运算。如果两个相应的二进位都为1,则该位的结果值为1,否则为0。即 0&0=0;0&1=0;1&0=0;1&1=1; 例子:int x = 62255550; y =0xff; 转二进制:x = 62255550 = 11101101011111000110111110; y = 0xFF = 11111111 ; 11 10110101 11110001 10111110 &00 00000000 00000000 11111111 00 00000000 00000000 10111110 (从右到左做与运算,不足的补0) 如果参加&运算的是负数(如-3 & -5),则以补码形式表示为二进制数,然后按位进行“与”运算。 2、移位运算:java移位运算符三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。 --1、 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数。 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数。 左移的规则只记住一点:丢弃最高位,0补最低位 如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33%32=1位。 2)运算规则 按二进制形式把所有的数字向左移动对应的位数

大数据学习笔记——Java篇

断了今生、忘了曾经 提交于 2019-12-01 09:13:55
Java / 计算机基础知识整理 在进行知识梳理同时也是个人的第一篇技术博客之前,首先祝贺一下,经历了一年左右的学习,从完完全全的计算机小白,现在终于可以做一些产出了!可以说也是颇为感慨,个人认为,学习本身就应该是有方法论的,前人总结了不少比较好的学习方法(比如说费曼学习法,金字塔原理),我们在进行好方法借鉴的同时,也不要忘了让整个学习过程形成一个闭环,我认为,向他人教学,或是定期将已有的知识进行一些梳理,总结,就是闭环的一种,这种方式在向他人传授知识的同时,更是对自己已有知识体系的一次查漏补缺。好了,废话不多说了,开始我们的行程了吧,第一次以这种方式进行分享,势必还有很多不够完善之处,我自己也会坚持博客的撰写,希望能够越写越好,技术进步的同时,也锻炼自己的文笔!(仪式感还是需要滴) 实际上,对于大数据技术本人已有一些应用场景了,特此开了自己的博客,将以往的知识点进行梳理: 1. Java发展历史及其语言概述 1946年2月,美国数学家冯 诺伊曼研发出了世界上第一台计算机,ENIAC,而这也标志着人类科技发展史上的一座伟大里程碑。不同于自然语言,计算机并听不懂人类所说的话,因此,计算机语言诞生了,计算机语言的发展史经历了机器码到汇编语言再到高级语言三个阶段,第一代的机器码完全就是01代码,而汇编语言则出现了一些简单的英文单词,第三代的高级语言更接近于人类语言,因此容易理解、记忆

运算符

末鹿安然 提交于 2019-11-29 13:41:27
1.算术运算符 + - * / % 2.关系运算符 == != > < >= <= 3.逻辑运算符 && || ! 4.赋值运算符 = += -= *= /= %= <<= >>= &= ^= |= 5.位运算符 & 按位与 | 按位或 ^ 按位异或 两个值相同,则为0 ~ 取反 << 左移 >> 右移 >>> 无符号右移 如果指定 A = 60; 及 B = 13; 两个变量对应的二进制为: A = 0011 1100 B = 0000 1101 A&B = 0000 1100 A|B = 0011 1101 A^B = 0011 0001 ~A = 1100 0011 来源: https://www.cnblogs.com/hapyygril/p/11518775.html

基础位运算基本原理和应用

十年热恋 提交于 2019-11-26 21:08:16
微信公众号 位运算是编程语言的基础,在看源码的时候会看到很多位运算代码,但是在项目代码中很少会看到位运算。因为应用代码中,有很多判断和计算都可以直接用数值的判断和计算完成,没有必要去用位运算,以至于这些基础的东西慢慢用的越来越少,慢慢也就忘了。导致的一个结果就是看源代码很费力,因为大量的位运算逻辑,看不懂。 作为程序员感觉数据位运算是非常必要,有点如下: 看源码时能够更好的理解 位运算更接近计算机的习惯,执行的效率会更高 装逼利器,在项目中使用位运算,体现逼格 N种基本的位运算 位运算 -- 与运算符(&) 运算规则: 操作数1 0 0 1 1 操作数2 0 1 0 1 与运算 0 0 0 1 规则总结:只有两个操作数都是1的时候运算结果才为1,其他都是0。换句话说就是只要包含0就是0。 运算如下: 位运算 -- 或运算符(|) 运算规则: 操作数1 0 0 1 1 操作数2 0 1 0 1 或运算 0 1 1 1 规则总结:只有两个操作数都是0的时候运算结果才为0,其他都是1。换句话说就是只要包含1就是1。 运算如下: 位运算 -- 非运算符(~) 运算规则: 操作数 1 0 或运算 0 1 规则总结:取反操作,1变0,0变1。 位运算 -- 异或运算符(^) 运算规则: 操作数1 0 0 1 1 操作数2 0 1 0 1 或运算 0 1 1 0 规则总结:操作数相同