移位运算符
移位运算符和按位运算符一样,同属于位运算符,因此移位运算符的位指的也是二进制位。它包括以下几种:
1. 左移位(<<):将操作符左侧的操作数向左移动操作符右侧指定的位数。移动的规则是在二进制的低位补0。
2. 有符号右移位(>>):将操作符左侧的操作数向右移动操作符右侧指定的位数。移动的规则是,如果被操作数的符号为正,则在二进制的高位补0;如果被操作数的符号为负,则在二进制的高位补1。
3. 无符号右移位(>>>):将操作符左侧的操作数向右移动操作符右侧指定的位数。移动的规则是,无论被操作数的符号是正是负,都在二进制位的高位补0。
注意,移位运算符不存在“无符号左移位(<<<)”一说。与按位运算符一样,移位运算符可以用于byte、short、int、long等整数类型,和字符串类型char,但是不能用于浮点数类型float、double;当然,在Java5.0及以上版本中,移位运算符还可用于byte、short、int、long、char对应的包装器类。我们可以参照按位运算符的示例写一个测试程序来验证,这里就不再举例了。
与按位运算符不同的是,移位运算符不存在短路不短路的问题。
写到这里就不得不提及一个在面试题中经常被考到的题目:
引用
请用最有效率的方法计算出2乘以8等于几?
这里所谓的最有效率,实际上就是通过最少、最简单的运算得出想要的结果,而移位是计算机中相当基础的运算了,用它来实现准没错了。左移位“<<”把被操作数每向左移动一位,效果等同于将被操作数乘以2,而2*8=(2*2*2*2),就是把2向左移位3次。因此最有效率的计算2乘以8的方法就是“2<<3”。
最后,我们再来考虑一种情况,当要移位的位数大于被操作数对应数据类型所能表示的最大位数时,结果会是怎样呢?比如,1<<35=?呢?
这里就涉及到移位运算的另外一些规则:
1. byte、short、char在做移位运算之前,会被自动转换为int类型,然后再进行运算。
2. byte、short、int、char类型的数据经过移位运算后结果都为int型。
3. long经过移位运算后结果为long型。
4. 在左移位(<<)运算时,如果要移位的位数大于被操作数对应数据类型所能表示的最大位数,那么先将要求移位数对该类型所能表示的最大位数求余后,再将被操作数移位所得余数对应的数值,效果不变。比如1<<35=1<<(35%32)=1<<3=8。
5. 对于有符号右移位(>>)运算和无符号右移位(>>>)运算,当要移位的位数大于被操作数对应数据类型所能表示的最大位数时,那么先将要求移位数对该类型所能表示的最大位数求余后,再将被操作数移位所得余数对应的数值,效果不变。。比如100>>35=100>>(35%32)=100>>3=12。
下面的测试代码验证了以上的规律:
public abstract class Test {
public static void main(String[] args) {
System.out.println("1 << 3 = " + (1 << 3));
System.out.println("(byte) 1 << 35 = " + ((byte) 1 << (32 + 3)));
System.out.println("(short) 1 << 35 = " + ((short) 1 << (32 + 3)));
System.out.println("(char) 1 << 35 = " + ((char) 1 << (32 + 3)));
System.out.println("1 << 35 = " + (1 << (32 + 3)));
System.out.println("1L << 67 = " + (1L << (64 + 3)));
// 此处需要Java5.0及以上版本支持
System.out.println("new Integer(1) << 3 = " + (new Integer(1) << 3));
System.out.println("10000 >> 3 = " + (10000 >> 3));
System.out.println("10000 >> 35 = " + (10000 >> (32 + 3)));
System.out.println("10000L >>> 67 = " + (10000L >>> (64 + 3)));
}
}
结果为:
1. 1 << 3 = 8
2. (byte) 1 << 35 = 8
3. (short) 1 << 35 = 8
4. (char) 1 << 35 = 8
5. 1 << 35 = 8
6. 1L << 67 = 8
7. new Integer(1) << 3 = 8
8. 10000 >> 3 = 1250
9. 10000 >> 35 = 1250
10. 10000L >>> 67 = 1250
分享到:
相关推荐
7. 运算符重载的缺点:运算符重载也存在一些缺点,例如,它可能会使我们的程序变得更加复杂和难以理解,特别是在多个运算符重载的情况下。 运算符重载是 C++ 中一个非常有用的机制,它可以使我们的程序更加简洁和...
还有一些特殊的运算符,如函数调用运算符 `()`、数组下标运算符 `[]`、结构体成员访问运算符 `.` 等。 通过以上介绍,我们可以看出C语言中的运算符非常丰富多样,它们为编程提供了强大的工具,使得开发者能够灵活...
除了上述常见的运算符之外,还有一些特殊的运算符: - 函数调用(()):用于调用函数。 - 下标访问([]):用于数组元素的访问。 - 结构体成员访问(.):用于访问结构体中的成员。 - 指针运算符(* 和 &):星号(*...
由于涉及到三个矩阵(左乘矩阵、右乘矩阵和结果矩阵),所以这里可能需要使用重载的"和">>"运算符来进行矩阵的链式乘法。 4. **矩阵转置**:矩阵的转置就是将原矩阵的行变成列,列变成行。可以创建一个新的矩阵,...
下面将详细介绍Java中各种运算符的优先级及结合性,并提供一些实例帮助理解。 #### 二、运算符优先级表 1. **最高优先级**: - `()`(圆括号):用于分组操作,可以改变运算符的默认优先级。 - `[]`(方括号):...
在编程和教学实践中,我们经常遇到一些复杂的运算符优先级关系的问题。例如,在一个表达式中同时出现了多个运算符时,我们如何确定它们的优先级关系呢?这个时候,我们可以使用上述规则来确定它们的优先级关系。 ...
JAVA程序设计课件-JAVA运算符 本篇资源摘要信息主要介绍了JAVA程序设计的基本语法知识,涵盖了...在对一些比较复杂的表达式进行运算时,要明确表达式中所有运算符参与运算的先后顺序,把这种顺序称作运算符的优先级。
除了逻辑运算符外,还有一些用于数值或字符串比较的运算符: - **=** 和 **!=**:用于字符串或整型比较,在[]中只能用于字符串比较。 - **<** 和 **>**:仅用于整型比较。 - **-eq**、**-ne**、**-lt**、**-gt**、*...
值得注意的是,虽然C和C++的运算符优先级基本相同,但C++中有一些额外的运算符,比如成员运算符`->*`和`.*`,以及范围解析运算符`::`,这些在C语言中不存在。因此,在使用C++时,应特别关注这些特有的运算符及其...
- 但有三个运算符是从右到左结合的:单目运算符、条件运算符(三目运算符,`? :`)和赋值运算符。例如,在`a = b = c = 5;`中,首先计算`c = 5`,然后`b = 5`,最后`a = 5`。 3. **特殊示例**: - `1 根据优先级...
标题和描述中提到的知识点为“C语言的运算符”,...通过以上的知识点可以了解到C语言中运算符的种类、功能以及使用中应该注意的事项,从而在编写C语言程序时能够正确地运用各种运算符来表达复杂的数据处理和逻辑判断。
在MySQL数据库系统中,存在一些特有的运算符,这些运算符在与Microsoft SQL Server(MSSQL)比较时,是MSSQL所不具备的。本篇主要介绍三个这样的运算符:安全等于运算符()、LEAST和GREATEST运算符以及正则表达式...
该方法通过将表达式分解为“先变层”、“使用层”和“后变层”三个步骤进行计算,能有效地处理包含多个自增自减运算符的复杂情况。 简而言之,三层计算法是将一个包含多个自增自减运算符的表达式从左到右依次分为三...
本文将详细讲解`LIKE`运算符的使用、语法、优点以及一些实用示例,帮助你深入理解和掌握这一功能。 一、`LIKE`运算符的基本概念 `LIKE`是SQL中的一个关键字,主要用于在`WHERE`子句中进行条件匹配,特别是在处理...
#### 三、字符串比较运算符 字符串比较运算符用于比较字符串的大小: - `gt`:大于 - `ge`:大于等于 - `lt`:小于 - `le`:小于等于 - `eq`:等于 - `ne`:不等于 - `cmp`:三向比较,与整数比较中的 `<=>` 类似...
#### 三、比较运算符 比较运算符用于比较两个值,并返回一个布尔结果。以下是 Swift 支持的主要比较运算符及其示例: | 运算符 | 描述 | 实例 | |--------|--------------------|-------------------| | `==` | ...
赋值运算符不仅在简单的赋值语句中有广泛的应用,还在复杂的表达式中扮演着重要的角色。 **2.1 赋值运算符在赋值语句中的应用** 赋值语句是将一个值分配给变量的基本操作。最常用的赋值运算符是 `=`。例如: ``` ...
除了“三层计算法”,在编程实践中还有其他一些技巧可用于处理自增自减运算符。例如,编写辅助函数来模拟自增或自减操作的行为,或者使用宏定义来封装自增自减的行为。在编写代码时,需要特别注意代码的可读性和维护...
尽管大多数VisualFoxPro教材通常只介绍了一些简单的比较运算符,如等于(=)、不等于(或!=)、大于(>)、小于(<)、大于等于(>=)和小于等于(),但实际使用中,为了执行更复杂的查询任务,还经常需要使用其它...
除了上述常见的运算符外,Lua还提供了一些特殊的运算符,如字符串连接和长度计算。 | 运算符 | 描述 | 示例 | |--------|----------------------|------------------| | `...` | 字符串连接 | `a…b`将返回"Hello ...