`

一些比较复杂的运算符(二)

 
阅读更多

按位运算符

1. 按位与运算(&):二元运算符。当被运算的两个值都为1时,运算结果为1;否则为0。
2. 按位或运算(|):二元运算符。当被运算的两个值都为0时,运算结果为0;否则为1。
3. 按位异或运算(^):二元运算符。当被运算的两个值中任意一个为1,另一个为0时,运算结果为1;否则为0。
4. 按位非运算(~):一元运算符。当被运算的值为1时,运算结果为0;当被运算的值为0时,运算结果为1。
这里不像我们看到的逻辑运算符(与运算&&、或运算||、非运算!)操作的是布尔值true或false,或者是一个能产生布尔值的表达式;“按位运算符”所指的“位”就是二进制位,因此它操作的是二进制的0和1。在解释按位运算符的执行原理时,我们顺便说说它们和逻辑运算符的区别。
1. 逻辑运算符只能操作布尔值或者一个能产生布尔值的表达式;按位运算符能操作整型值,包括byte、short、int、long,但是不能操作浮点型值(即float和double),它还可以操作字符型(char)值。按位运算符不能够操作对象,但是在Java5.0及以上版本中,byte、short、int、long、char所对应的包装器类是个例外,因为JAVA虚拟机会自动将它们转换为对应的基本类型的数据。

public class BitOperatorTest {
public static void main(String[] args) {
// 整型
byte b1 = 10, b2 = 20;
System.out.println("(byte)10 & (byte)20 = " + (b1 & b2));
// 字符串型
char c1 = 'a', c2 = 'A';
System.out.println("(char)a | (char)A = " + (c1 | c2));
// 基本类型的包装器类
Long l1 = new Long(555), l2 = new Long(666);
System.out.println("(Long)555 ^ (Long)666 = " + (l1 ^ l2));
// 浮点型
float f1 = 0.8F, f2 = 0.5F;
// 编译报错,按位运算符不能用于浮点数类型
// System.out.println("(float)0.8 & (float)0.5 = " + (f1 & f2));
}
}

 结果为:

(byte)10 & (byte)20 = 0
(char)a | (char)A = 97
(Long)555 ^ (Long)666 = 177
• 逻辑运算符的运算遵循短路形式,而按位运算符则不是。所谓短路就是一旦能够确定运算的结果,就不再进行余下的运算。
下面的例子更加直观地展现了短路与非短路的区别:

package com.sdjt.study.fuhao;

/**
 * @author:lyy
 * @version 创建时间:2009-8-4 下午08:00:06 类说明
 */
public class OperatorTest1 {
	public boolean leftCondition() {
		System.out.println("执行-返回值:false;方法:leftCondition()");
		return false;
	}

	public boolean rightCondition() {
		System.out.println("执行-返回值:true;方法:rightCondition()");
		return true;
	}

	public int leftNumber() {
		System.out.println("执行-返回值:0;方法:leftNumber()");
		return 0;
	}

	public int rightNumber() {
		System.out.println("执行-返回值:1;方法:rightNumber()");
		return 1;
	}

	public static void main(String[] args) {
		OperatorTest ot = new OperatorTest();
		if (ot.leftCondition() && ot.rightCondition()) {
			// do something
		}
		System.out.println();
		int i = ot.leftNumber() & ot.rightNumber();
	}
}

 

运行结果已经很明显地显示了短路和非短路的区别,我们一起来分析一下产生这个运行结果的原因。当运行“ot.leftCondition() &&ot.rightCondition()”时,由于方法leftCondition()返回了false,而对于“&&”运算来说,必须要运算符两边的值都为true时,运算结果才为true,因此这时候就可以确定,不论rightCondition()的返回值是什么,“ot.leftCondition() && ot.rightCondition()”的运算值已经可以确定是false,由于逻辑运算符是短路的形式,因此在这种情况下,rightCondition()方法就不再被运行了。而对于“ot.leftNumber() & ot.rightNumber()”,由于“leftNumber()”的返回值是0,对于按位运算符“&”来说,必须要运算符两边的值都是1时,运算结果才是1,因此这时不管“rightNumber()”方法的返回值是多少,“ot.leftNumber() & ot.rightNumber()”的运算结果已经可以确
定是0,但是由于按位运算符是非短路的,所以rightNumber()方法还是被执行了。这就是短路与非短路的区别。

分享到:
评论
1 楼 wpf523 2012-08-08  
赞一个啊,楼主加油

相关推荐

    第二十六讲 运算符重载2(课件+源代码).

    在"运算符重载2.ppt"这个课件中,可能会详细讲解如何重载各种运算符,包括复合赋值运算符(如 "+=")、比较运算符(如 "==" 和 "!=")以及流输入输出运算符(如 "和 ">>")。这些运算符的重载通常涉及到操作数的类型...

    C语言中,有哪些算术运算符

    还有一些特殊的运算符,如函数调用运算符 `()`、数组下标运算符 `[]`、结构体成员访问运算符 `.` 等。 通过以上介绍,我们可以看出C语言中的运算符非常丰富多样,它们为编程提供了强大的工具,使得开发者能够灵活...

    使用C++实现矩阵运算(运算符重载)

    在C++中,可以使用`new`运算符动态分配内存来创建二维数组,代表矩阵的元素。这样做的好处是灵活性高,但需要注意的是,使用完数组后必须用`delete`释放内存,防止内存泄漏。 接下来,我们将探讨如何实现这些基本的...

    单片机C语言运算符

    除了上述常见的运算符之外,还有一些特殊的运算符: - 函数调用(()):用于调用函数。 - 下标访问([]):用于数组元素的访问。 - 结构体成员访问(.):用于访问结构体中的成员。 - 指针运算符(* 和 &):星号(*...

    C++ 复数类的实现 运算符重载

    此外,我们还可以重载其他运算符,如赋值运算符(=)、比较运算符(==, !=, <, >, , >=)等,以提供更完整的复数类功能。 在提供的压缩包文件中,可能包含了`readme.txt`,它是对这个项目的简要说明,可能涵盖了...

    Javascript常用运算符

    下面,我们将根据给定的文件信息,详细解析JavaScript中的一些常用运算符。 ### 算术运算符 #### 加法运算符 `+` 加法运算符用于将两个数值相加。例如,如果`x`为2,`y`为5,那么`x + y`的结果就是7。此外,当其中...

    Java运算符优先级

    下面将详细介绍Java中各种运算符的优先级及结合性,并提供一些实例帮助理解。 #### 二、运算符优先级表 1. **最高优先级**: - `()`(圆括号):用于分组操作,可以改变运算符的默认优先级。 - `[]`(方括号):...

    C语言初学者入门讲座 第四讲 运算符和表达式

    C语言作为一种高级编程语言,其运算符和表达式的多样性和复杂性是学习C语言时的重要组成部分。在C语言中,运算符是用来进行数据运算的符号,它可以包括加减乘除等算术运算符,也可以是用于比较、逻辑运算、位操作等...

    ARM汇编语言中的表达式和运算符.doc

    除了上述运算符外,还有一些其他常用的运算符: - **?运算符**:返回某段代码所生成的可执行代码的长度。 - **DEF运算符**:判断一个符号是否被定义过。 ### 总结 通过对ARM汇编语言中的表达式和运算符的学习,...

    小议二级C语言之逻辑运算符.pdf

    标题中提到的“小议二级C语言之逻辑运算符”,表明本文主要探讨C语言中的逻辑运算符相关知识点。逻辑运算符是C语言中用于执行逻辑运算的符号,主要包括逻辑与(&&)、逻辑或(||)和逻辑非(!)三种。逻辑运算符常...

    C++程序设计 运算符重载实验(二)

    ### C++程序设计 运算符重载实验(二) #### 实验背景 在C++中,运算符重载是一项非常强大的功能,它允许我们扩展内置运算符的意义以支持自定义类型的操作。这对于提高代码的可读性和简化编程任务特别有用。本实验...

    巧记C语言运算符优先级

    在编程和教学实践中,我们经常遇到一些复杂的运算符优先级关系的问题。例如,在一个表达式中同时出现了多个运算符时,我们如何确定它们的优先级关系呢?这个时候,我们可以使用上述规则来确定它们的优先级关系。 ...

    JAVA程序设计课件-JAVA运算符.pptx

    JAVA程序设计课件-JAVA运算符 本篇资源摘要信息主要介绍了JAVA程序设计的基本语法知识,涵盖了...在对一些比较复杂的表达式进行运算时,要明确表达式中所有运算符参与运算的先后顺序,把这种顺序称作运算符的优先级。

    操作符运算符.docx

    C++ 还包含了一些特殊的运算符,比如 sizeof 运算符用于获取类型或变量占用的内存字节数,以及类型转换运算符 `(type)` 用于强制类型转换。此外,成员访问运算符 (. 和 ->) 用于访问对象的成员,解引用运算符 (*) 和...

    PHP7 新特性:合并运算符、太空船运算符(组合比较符).md

    `运算符可能会比显式检查`NULL`并返回默认值稍慢一些。然而,这种差异在大多数情况下都是微不足道的。 4. **依赖版本**:NULL合并运算符是在PHP 7.0中引入的,因此如果你的代码需要在PHP 5.x版本上运行,你将无法...

    linux shell 逻辑运算符

    除了逻辑运算符外,还有一些用于数值或字符串比较的运算符: - **=** 和 **!=**:用于字符串或整型比较,在[]中只能用于字符串比较。 - **<** 和 **>**:仅用于整型比较。 - **-eq**、**-ne**、**-lt**、**-gt**、*...

    c语言运算符优先级管理系统

    在C语言中,运算符是程序中的重要组成部分,它们用于执行特定的数学或逻辑操作。了解运算符的优先级对于编写高效且无误...在实际开发中,可以借助一些工具或在线资源来检查和理解复杂的运算符表达式,以确保其正确性。

    运算符优先级等级口诀.pdf

    C语言中的运算符优先级分为15个等级,每个等级的运算符有不同的结合性,这有助于程序员理解和编写复杂的表达式。以下是各等级运算符的详细介绍: 1. **最高优先级** (1级,左结合): - `()`:圆括号用于分组运算,...

    C语言运算符大全.pdf

    还有一些特殊的运算符,例如 sizeof 用于计算数据类型或变量的大小,逗号(,)用于分隔表达式列表中的多个表达式,以及指针运算符 * 和 &,分别用于访问和获取变量的地址。 C语言中运算符还具有优先级和结合性规则。...

    C#-运算符-OperatorsAppl

    还有一些特殊的运算符,如`typeof`用于获取类型信息,`null`运算符`?.`和`??`,分别用于安全地访问可能为`null`的对象成员和提供一个默认值以防变量为`null`。 C#还支持重载运算符,这意味着开发者可以为自己的类...

Global site tag (gtag.js) - Google Analytics