位运算——Java语言描述

举报
秋名山码民 发表于 2022/05/08 23:50:07 2022/05/08
【摘要】 如何打印一个二进制数? public static void print(int num) { for (int i = 31; i >= 0; i--) { System.out.print((num & (1 << i)) == 0 ? "0" : "1"); } System.out.println();}int 32位 0~2^31-1,真正表示的范...

如何打印一个二进制数?

	public static void print(int num) {
    for (int i = 31; i >= 0; i--) {
        System.out.print((num & (1 << i)) == 0 ? "0" : "1");
    }
    System.out.println();
}

int 32位 0~2^31-1,真正表示的范围实际上是从0~2^30

原因:int型既可以表示正数,也可以表示负数

符号位:如果符号位为0,一定是一个非负数,如果符号为1,那么代表你绝逼是一个负数

左移:乘2的操作

int num = 12121212;
print(num);
//左移 *2的效果
print(num << 1);
print(num << 2);

负数:在Java中的范围是 -2^31

int am = Integer.MIN_VALUE;
print(am);

那么怎么算的负数呢?

我们先来打印一个-1

print(-1);

发现全部都是1,首先符号位代表你这是一个负数,然后说明,负级把后面的全部状态都进行取反的操作,最后在加1,10000……1,-000000……1.就是-1

为什么要进行取反+1的操作,而不是直接存储?
正数,直接就用它裸的这个值进行计算
负数,使符号位能与有效值部分一起参加运算,从而简化运算规则。

右移:除以2的操作

在Java中有俩个右移操作一个是>>,另一个是>>>

			int d = 1024;
    print(d);
    //右移除2,最左侧用符号位来补充
    print(d >> 1);//带符号右移
    int e = Integer.MIN_VALUE;
    print(e >> 1);//带符号位右移,出现俩个1
    print(e >>> 1);//不带符号位右移
    //系统最小取反+1后还是它自己
    print(am);
    print((~am + 1));

值得注意的是系统最小取反+1还是它自己,当你要使用最小值的时候,也就是应该换用long类型的时候了

应用,(~a+1)就是a的相反数

int a = 5;
print(a);//5
print(~a+1);//-5

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。