首页 > 编程语言 >Java中的位运算符号详解(&、|、^、~、<<、>>、>>>)(转载)

Java中的位运算符号详解(&、|、^、~、<<、>>、>>>)(转载)

时间:2023-05-12 20:04:20浏览次数:47  
标签:123 false 运算 符号 详解 print Java true

位运算符号概览

符号 描述 运算规则
& 两个位都为1时,结果才为1
| 两个位都为0时,结果才为0
^ 异或 两个位相同为0,不同为1
~ 取反 所有位置0变1,1变0
<< 左移 各二进位全部左移若干位,高位丢弃,低位补0
>> 带符号右移 各二进位全部右移若干位,低位丢弃,高位补为符号位
>>> 无符号右移 各二进位全部右移若干位,低位丢弃,高位补0

还有两个符号,并不是位运算符,但是容易与位运算符混淆,后面将与其相似的位运算符进行一并讲解:

符号 描述 运算规则
&& 逻辑与 左右表达式均为true时,运算最终结果才为true
|| 逻辑非 左右表达式只要有一个为true,运算最终结果就为true

一个工具

下面的函数可以帮助我们打印Java中int整型的在底层的32位信息,后面可以使用该工具对程序进行调试:

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();
}

// print(1);  -->  00000000000000000000000000000001
// print(-1); -->  11111111111111111111111111111111
// print(Integer.MAX_VALUE);  -->  01111111111111111111111111111111
// print(Integer.MAX_VALUE);  -->  10000000000000000000000000000000

下面开始对每个符号进行介绍。

按位与(&)、逻辑与(&&)

**按位与(&)**的具体运算规则为:

1 & 1 = 1		1 & 0 = 0		0 & 1 = 0		0 & 0 = 0
// 举例:
print(123);		// 00000000000000000000000001111011
print(321);		// 00000000000000000000000101000001
print(a & b);	// 00000000000000000000000001000001

// 任何数与0相与都等于0
// 任何数与自己相与都等于自己

在Java中,(&)不仅可以作为位运算符号,同样也可以作为逻辑与符号,

要注意:(&&)并不是位运算符号,不可以参与位运算!

**逻辑与(&)、逻辑与(&&)**的具体运算规则为:

true & true = true    true & false = false    false & true = false    false & false = false

true && true = true    true && false = false    false && true = false    false && false = false

两者的区别在于:

**逻辑与(&)**在运算时,不论(&)前面的表达式的结果是否为false,(&)后面的表达式都会执行运算;

而**逻辑与(&&)**在运算时,如果(&&)前面的表达式的结果为false,则(&&)后面的表达式就不会执行运算。

按位或(|)、逻辑或(||)

**按位与(&)**的具体运算规则为:

1 | 1 = 1		1 | 0 = 1		0 | 1 = 1		0 | 0 = 0
// 举例:
print(123);		// 00000000000000000000000001111011
print(321);		// 00000000000000000000000101000001
print(a | b);	// 00000000000000000000000101111011

// 任何数与0相或都等于自身
// 任何数与自己相或都等于自己

在Java中,(|)不仅可以作为位运算符号,同样也可以作为逻辑与符号。

要注意:(||)并不是位运算符号,不可以参与位运算!

**逻辑或(|)、逻辑或(||)**的具体运算规则为:

true | true = true    true | false = true    false | true = true    false | false = false	

true || true = true    true || false = true    false || true = true    false || false = false

两者的区别在于:

**逻辑或(|)**在运算时,不论(|)前面的表达式的结果是否为true,(|)后面的表达式都会执行运算;

而**逻辑或(||)**在运算时,如果(||)前面的表达式的结果为true,则(||)后面的表达式就不会执行运算。

异或(^)

**异或(^)**的具体运算规则为:

1 ^ 1 = 0		1 ^ 0 = 1		0 ^ 1 = 1		0 ^ 0 = 0	
// 即相同为0,不同为1
// 举例:
print(123);		// 00000000000000000000000001111011
print(321);		// 00000000000000000000000101000001
print(a ^ b);	// 00000000000000000000000100111010

// 任何数与0异或都等于自身
// 任何数与自己异或都为0

取反(~)

**取反(~)**的具体运算规则为:

~1 = 0		~0 = 1
// 举例:
print(123);		// 00000000000000000000000001111011
print(~a);		// 11111111111111111111111110000100
// 符号位也取反

**取反(~)**可以用来求相反数:

// 一个32整数,取反再+1,就是该数的相反数,效果等同于加负号(-)
int a = 123;
System.out.println(a);		// 123
System.out.println(~a+1);	// -123

说明:

由于Java中int类型的整数范围为−2^31 ∼ 2^31 − 1,负数的个数比正数多一个,这样就导致,所有的正数都有相应的负的相反数,但是并不是所有的负数都有正的相反数:

a = Integer.MIN_VALUE;
System.out.println(a);		// -2147483648
print(a);					// 10000000000000000000000000000000
System.out.println(~a+1);	// -2147483648
print(~a + 1);				// 10000000000000000000000000000000
// Java中int整数最小值的相反数还是其自身
// 如果一定需要对int整数最小值求相反数,请将int类型换为long类型

 左移(<<)

 左移表示的是某数的各二进位全部左移若干位,高位丢弃,低位补0

// 举例:
print(123);			// 00000000000000000000000001111011
print(123 << 1);	// 00000000000000000000000011110110	
// 整体左移1位,高位丢弃,低位补0

应用:

// 左移1位相当于在原数的基础上乘以2
System.out.println(123);	// 123
System.out.println(123<<1);	// 246
// 左移2位相当于在原数的基础上乘以4
System.out.println(2);		// 2
System.out.println(2<<2);	// 8
// 左移3位、4位...以此类推

带符号右移(>>)、无符号右移(>>>)

 **带符号右移(>>)**指的是各二进位全部右移若干位,低位丢弃,高位补为符号位

**无符号右移(>>>)**指的是各二进位全部右移若干位,低位丢弃,高位补0

int a = 123;	
print(a);		// 00000000000000000000000001111011
print(a>>2);	// 00000000000000000000000000011110
print(a>>>2);	// 00000000000000000000000000011110

int b = -123;
print(b);		// 11111111111111111111111110000101
print(b>>2);	// 11111111111111111111111111100001
print(b>>>2);	// 00111111111111111111111111100001

// 区别就在于:一个高位用符号位补,一个高位用0补

Java中没有(<<<)符号!!!

 

 

 转载于:https://blog.csdn.net/qq_44494578/article/details/125230581

标签:123,false,运算,符号,详解,print,Java,true
From: https://www.cnblogs.com/grassLittle/p/17396103.html

相关文章

  • 详解缓存更新策略及如何选择
    概述缓存更新是指在数据发生变化时,保持缓存和数据库的数据一致性的问题。如果缓存和数据库的数据不一致,会导致用户看到过期或者错误的数据,影响业务逻辑和用户体验。为了实现缓存更新,我们可以采用以下四种方式其中的一种:CacheAside策略:应用程序直接与数据库和缓存交互,并负责......
  • 22092133《Java程序设计》第一周学习总结
    1本周学习总结: 一个Java源文件可能编译出多个字节码文件。Scanner是Java的一个类,使用Scanner对象读取数据的时候,要注意next()方法只能读取到有效字符之前遇到的空白,并不能得到带有空格的字符串,nextLine()方法以Enter为结束符,返回输入回车之前的字符就可以获得空白2.书面作业......
  • Java程序设计模拟测试(专用试题)
    单选题Thread类中能运行线程体的方法是B.run()。start()方法会启动一个新的线程,init()方法是构造器的一部分,resume()方法是恢复一个暂停的线程。如果要把容器空间分成东、西、南、北、中五个区域,应采用的布局是D.BorderLayout。BorderLayout类可以将容器分为五个区域:EAST,W......
  • JavaWeb过滤器读取并修改POST请求的参数-YhtHttpServletRequestWrapper
    核心原理就是一个类:javax.servlet.http.HttpServletRequestWrapper一个简单的例子,当任何请求的参数里有aaa的时候,把它的值改成bbb新增一个类自定义的类CustomHttpServletRequestWrapper importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpSer......
  • java
    登录验证码是get请求@TableField(exist=false)是MyBatis-Plus框架提供的注解,用于实体类中对应的属性上,表示该属性在数据库表中不存在。也就是说,使用@TableField(exist=false)注解标记的属性不会被加入到SQL的字段列表中。......
  • K8S 常用资源 YAML 详解
    Pod资源对象yaml详解apiVersion:v1#必选,版本号,例如v1kind:Pod#必选,指定创建资源的角色/类型metadata:#必选,资源的元数据/属性name:string#必选,资源的名字,在同一个namespace中必须唯一namespace:string#必选,Pod所属的命名空间......
  • java学习第一天MarkDown学习
    Markdown学习标题三级标题#+空格表示一级标题,##+空格表示二级标题...最多到六级标题字体内容这是粗体****斜体这是斜体**斜体加粗这是斜体加粗每边个三个*删除线每边个两个~删除线引用">"表示引用分割线三个“-”表示分割线三个“*”也表示分割线图片 英......
  • 云原生第三周--kubernetes组件详解
    etcd组件etcd简介:etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。etcd具有下面这些属性:完全复制:集群中的每个节点都可以使用完整的存档高可用性:Etcd可用于避免......
  • PHP发送文件到JAVA项目
    https://blog.csdn.net/u012685554/article/details/126995307亲测有用。php代码$file=$_FILES['order_upload']['tmp_name'];////var_dump($file);exit();////判断文件是否存在if(!file_exists($file)){......
  • java可视化开发工具好用不好用?
    java可视化开发工具到底好用不好用?这是不少粉丝朋友经常询问到的一个问题。在数字化发展趋势越发明显的当下,java可视化开发工具可以帮助各中大型企业实现转型升级,它的灵活、简洁、易操作、可视化等功能优势,让很多客户朋友欣慰不已,仿佛寻觅到了市场的发展动向。今天,我们就一起来了......