java取反 -右移-左移-无符号右移的探讨
Java  /  管理员 发布于 3年前   235
取反:在二进制中第一位,1表示符数,0表示正数byte a = -1;原码:10000001反码:11111110补码:11111111 //异或: 00000000byte b = -2;原码:10000010反码:11111101补码:11111110 //异或: 00000001byte c = 3; // 10000101System.out.println(~a);System.out.println(~b);System.out.println(~c);
运算结果:01-4
右移:正数右移.负数右移 ,无符号右移
右移的符号是:>>
无符号右移的符号的:>>>
在左右位移时应注意,位移是否超过了数据的长度,如果超过了就会进行取摸运算等:下面的代码中有测试到
//右移://右移一个正数,右移一个整数每次在左边补0 int a = 5;System.out.println(a>>1); //原码;0000000101//右移一位: 0000000010System.out.println(a>>2); //原码;0000000101//右移两位: 0000000001 System.out.println(a>>3); //原码;0000000101//右移三位: 0000000000 System.out.println(a>>31);//原码; 0000000101//右移32位: 0000000000 System.out.println(a>>32); //int 为32位,当位移等于32时,相当于没有移动,会进行取摸运算 System.out.println(a>>34); //位移大于32时,进行取摸运算 34%32 = 2 //此时相当于位移两位 System.out.println(a>>>1);//无符号右移最高位补0 // 原码: 0000000101 //无符号右移 : 0000000010 2
运算结果:2100512
负数右移:
//右移一个负数,右移一个整数每次在左边补1//位移负数,应先将其装换成补码形式,再位移int a = -5;//原码:100000101//反码:111111010 反码是和原码的数相反 第一位相同(符号位)//补码:111111011 补码在反码后面加1System.out.println(a>>1);//补码:111111011 //补码右移一位: 111111101 -3System.out.println(a>>2);//补码:111111011 //补码右移两位: 111111110 -2System.out.println(a>>3);//补码:111111011 //补码右移三位: 111111111 -1System.out.println(a>>4);//补码:111111011 //补码右移四位: 111111111 -1System.out.println(a>>31);//补码:111111011 //补码右移31位: 111111111 -1System.out.println(a>>32); //int为32 位的数,在位移时,等于没有移动 -5System.out.println(a>>34);//int 为32位的,位移34会进行取摸运算 34%32 =2 -2 System.out.println(a>>>1); //无符号负数的右移在最高位补1;//补码:111111011 //无符号右移1位:011111101 此时负数将变成一个正数
-3-2-1-1-1-5-22147483645
左移:
左移的符号:<<
左移无符号的正负数的符号:<<<
左移的右边补0
//左移正数int a = 5;//补码:00000101System.out.println(a<<1);//00001010 10System.out.println(a<<2);//00010100 20System.out.println(a<<31);//为一个负数,左移应注意
运算结果:1020-2147483648
左移负数:
左移都是右边补0
int a = -5;//补码:11111011 System.out.println(a<<1);//左移一位:11110110 -10System.out.println(a<<2);//左移两位:11101100 -20System.out.println(a<<31);//左移31会出现问题System.out.println(a<<34);//相当于左移两位//左移两位:11101100 -20
运算结果:-10-20-2147483648-20
使用位移来求二进制的问题:
public static void main(String[] args) {//通过右移将十进制的数转换成二进制int a = 100;for(int i =31;i>0;i--){System.out.print(a>>i&1);}}
运算结果:0000000000000000000000000110010
路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..博主 在
科学上网翻墙之v2rayN-Core客户端免费公益节点使用教程中评论 @ mashrdn 多切换几个节点测试,免费ssr是没那么稳..mashrdn 在
科学上网翻墙之v2rayN-Core客户端免费公益节点使用教程中评论 V2rayn免费节点添加上去了,youtobe无法打开网页,是怎么回事..张伟 在
科学上网翻墙之v2rayN-Core客户端免费公益节点使用教程中评论 3q!有用,不过免费节点隔天就要去git上复制新的导进去..博主 在
科学上网翻墙访问Google , 上外网神器佛跳墙VPN(永久免费)使用流程步骤中评论 该篇教程已不能用了,告知大家,免的老有老铁问我!..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号