网站开发设计需求文档,前几年做哪个网站能致富,西安市住宅和城乡建设局网站,那个公司搭建网站文章目录 前言一、二进制在运算中介绍二、原码#xff0c;反码#xff0c;补码#xff08;针对有符号的#xff09;三、位运算符按位与按位或 |按位异或 ^按位取反 ~算术右移算术左移逻辑右移 总结 前言
原码#xff0c;反码#xff0… 文章目录 前言一、二进制在运算中介绍二、原码反码补码针对有符号的三、位运算符按位与按位或 |按位异或 ^按位取反 ~算术右移算术左移逻辑右移 总结 前言
原码反码补码对于Java程序员来说是一个重点也是对于初学者来说的一个难点这里我给出一些简单易懂的规律与介绍适合快速入门。本篇内容是跟位运算符一起讲解的正好可以做一些位运算符的习题来掌握原码反码补码的内容,也便于较好理解位运算符。 一、二进制在运算中介绍
二进制是逢2进1位的进位制0、1是基本算符。现代的电子计算机技术全采用的是二进制因为它只使用0、1两个数字符号非常简单方便易于用电子实现。计算机内部处理的信息都是采用二进制数来表示的。
二、原码反码补码针对有符号的
二进制的最高制位是符号位0表示正数1表示负数。正数三码合一原码反码补码都一样均是该数的二进制数。负数的反码它的符号位不变其他取反0-1,1-0。负数的补码它反码 1负数的反码它补码 -1。0的反码补码都是0。java没有无符号数换而言之Java中的数都是有符号的。 在计算机运算的时候都是以补码的方式来运算的。所以下面位运算符的运算都是先转为补码再操作运算结果还是要回归转换到原码。
三、位运算符
在讲述下面位运算符之前我来解释一下高位低位以补位以及溢出这些词语的意思方便大家更容易理解下面的内容。右移为例下面写错了左移两位改为右移两位如果看不懂就配合着下面7个位运算符的例子大家就明白了 Java有7个位运算符、|、^、~、、和特别注意没有符号 按位与 两位全为1结果是1否则为0 //2 3 22 的原码:00000000 00000000 00000000 0000010补码00000000 00000000 00000000 0000010//正数三码一样3 的原码:00000000 00000000 00000000 0000011补码00000000 00000000 00000000 0000011//正数三码一样2 3 00000000 00000000 00000000 0000001000000000 00000000 00000000 00000011 //对补码进行竖向操作000010111-----------------------------------------00000000 00000000 00000000 00000010//结果是补码要转为原码//正数三码一样故还是这个2按位或 | 两位有一个为1结果为1否则为0 //2 | 3 32 的原码:00000000 00000000 00000000 00000010补码00000000 00000000 00000000 00000010//正数三码一样3 的原码:00000000 00000000 00000000 00000011补码00000000 00000000 00000000 00000011//正数三码一样2 | 3 00000000 00000000 00000000 0000001000000000 00000000 00000000 00000011 //对补码进行竖向操作0|00,1|11,0|11-----------------------------------------00000000 00000000 00000000 00000011//结果是补码要转为原码//正数三码一样故还是这个3按位异或 ^ 两位一个为1一个为0结果为1否则为0 //2 ^ 3 12 的原码:00000000 00000000 00000000 00000010补码00000000 00000000 00000000 00000010//正数三码一样3 的原码:00000000 00000000 00000000 00000011补码00000000 00000000 00000000 00000011//正数三码一样2 ^ 3 00000000 00000000 00000000 0000001000000000 00000000 00000000 00000011 //对两行补码进行竖向操作0^00,1^10,0^11-----------------------------------------00000000 00000000 00000000 00000001//结果是补码要转为原码//正数三码一样故还是这个1按位取反 ~ 0-1,1-0 // ~ -2 1-2 的原码:10000000 00000000 00000000 00000010反码11111111 11111111 11111111 11111101 补码 11111111 11111111 11111111 11111102 //反码111111111 11111111 11111111 11111110//逢2进1~ -200000000 00000000 00000000 00000001 //对补码进行取反操作//结果是补码要转为原码//最高位是0为正数三码一样1算术右移 低位溢出符号位不变并用符号位补溢出的高位。本质nmn/2/2/…(除m个2) //1 2 01 的原码00000000 00000000 00000000 00000001补码 00000000 00000000 00000000 00000001//正数三码一样1 2: 00000000 00000000 00000000 00000000//对补码进行操作整体右移两位符号位补高位//结果是补码要转为原码//最高位是0为正数三码一样0 //本质1 2 1/2/20
算术左移 符号位不变低位补零。 本质nmn22*…(乘m个2) //1 2 41 的原码00000000 00000000 00000000 00000001补码 00000000 00000000 00000000 00000001//正数三码一样1 2: 00000000 00000000 00000000 00000100//整体左移两位低位补零//结果是补码要转为原码//最高位是0为正数三码一样 4 //本质1 2 1*2*24逻辑右移 低位溢出高位补零。 //4 2 14的原码00000000 00000000 00000100补码00000000 00000000 00000100 4 2: 00000000 00000000 00000001//结果是补码,最高位是0正数三码一样也是原码 1对于正数逻辑右移跟算术右移是一样的----------------------------------------------------------------------而负数就不是这样因为算术右移高位补符号位所以正数补0负数补1但是逻辑右移高位均补0这对正数没什么影响但是对负数影响很大因为补的高位由1变为0即由正变负转为原码时除符号位补的高位变成1如 -22-2 的原码:10000000 00000000 00000000 00000010反码11111111 11111111 11111111 11111101 补码 11111111 11111111 11111111 11111102 //反码111111111 11111111 11111111 11111110//逢2进1-22:00111111 11111111 11111111 11111111 //整体右移两位高位补0,结果是补码00111111 11111111 11111111 11111110 //转为反码01000000 00000000 00000000 00000001 //转为原码//注意此时高位有1这就变成了一个很大的数2^302^0上面算术右移的本质总结还不算太准确。就比如-22 -1按照本质的话-1/2/20其实大家还是应该转换成补码去理解一下就懂了。 //这个本质不适用就是因为当它算术右移运算正好等于-1时-n/2/2/...-1再右移多少位还是-1-1 的原码10000000 00000000 00000000 00000001反码 11111111 11111111 11111111 11111110补码 11111111 11111111 11111111 11111111所以无论你再右移按照算术右移规则低位溢出符号位不变并用符号位补溢出的高位你的补码永远是11111111 11111111 11111111 11111111所以答案永远是 -1算术左移的本质总结是对的大家可以用我上面的方法推导一下 总结
原码反码补码是一个必要的基础希望把基础打好才能走得更长远学到后面越轻松虽然你目前不一定用到但是很重要希望大家一定要注重基础的筑建一起加油。如果大家把我这篇文章仔细弄懂大家对这些内容的掌握就已经可以了不需要再深入了。