Scala的运算符

1.Scala的运算符细节说明

先看几个例子

scala> val r1 = 10 /3
r1: Int = 3

scala> val r2 : Double = 10 /3
r2: Double = 3.0

scala> val r3 : Double = 10.0 /3
r3: Double = 3.3333333333333335


1) 对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。例如:var x : Int = 10/3 ,结果是3
2) 当对一个数取模时,可以等价a%b=a-a/b*b , 这样我们可以看到取模的一个本质运算(和java的取模规则一样)。
3) 注意:Scala 中没有++、--操作符,需要通过+=、-=来实现同样的效果

2. 关系运算符(比较运算符)

使用陷阱: 如果两个浮点数进行比较,应当保证数据类型一致

3. 位逻辑运算符

位逻辑运算符包含 4 个:&(与)、|(或)、~(非)和 ^(异或)。除了 ~(即位取反)为单目运算符外,其余都为双目运算符。表 1 中列出了它们的基本用法。
 

表 1 位逻辑运算符
运算符含义实例结果
&按位进行与运算(AND)4 & 54
|按位进行或运算(OR)4 | 55
^按位进行异或运算(XOR)4 ^ 51
~按位进行取反运算(NOT)~ 4-5

位与运算符

位与运算符为&,其运算规则是:参与运算的数字,低位对齐,高位不足的补零,如果对应的二进制位同时为 1,那么计算结果才为 1,否则为 0。因此,任何数与 0 进行按位与运算,其结果都为 0。
例如下面的表达式:

100&0

图 1 所示为这个运算过程,结果为 0。


图 1  100位与0的运算过程


下面是两个非零的数字进行位与运算的过程。

 
  1. int x = 5,y = 12; // 创建整型变量保存两个数
  2. int z = x&y; // 对这两个数进行位与运算,结果保存到z


这两行语句执行后变量 Z 的值是 4,图 2 所示为这个运算过程。
 


图 2  5位与12的运算过程

位或运算符

位或运算符为|,其运算规则是:参与运算的数字,低位对齐,高位不足的补零。如果对应的二进制位只要有一个为 1,那么结果就为 1;如果对应的二进制位都为 0,结果才为 0。

下面是一个使用位或运算符的表达式。

11|7


运算结果为 15,图 3 所示为其运算过程。
 


图 3  11位或7的运算过程

位异或运算符

位异或运算符为^,其运算规则是:参与运算的数字,低位对齐,高位不足的补零,如果对应的二进制位相同(同时为 0 或同时为 1)时,结果为 0;如果对应的二进制位不相同,结果则为 1。

下面是一个使用位异或运算符的表达式。

11^7


运算结果为 12,图 4 所示为其运算过程。
 


图 4  11位异或7的运算过程


提示:在有的高级语言中,将运算符^作为求幂运算符,要注意区分。

位取反运算符

位取反运算符为~,其运算规则是:只对一个操作数进行运算,将操作数二进制中的 1 改为 0,0 改为 1。

下面是一个使用位取反运算符的表达式。

~10


运算结果为 65525,图 5 所示为其运算过程。
 


图 5  对10位取反的运算过程


我们可以使用如下的程序来检查这个运算结果。

 
  1. int i = 10;
  2. System.out.printf("%d \n",~i);


编译执行以上程序,会发现输出的结果是 -11,而不是 65525。这是因为取反之后的结果是十六进制数,而在上面的程序中使用 %d 将输出转换为了十进制数。

可以使用如下语句查看十六进制结果。

 
  1. int i=10;
  2. System.out.printf("%x \n",~i);


可以看到输出结果为 fff5,将它转换为二进制是 1111111111110101。这个二进制数的最高位为 1,表示这个数为负数。除最高位外,按位取反再加 1,即得到二进制原码 1000000000001011,用十进制数表示即为 -11。

注意:位运算符的操作数只能是整型或者字符型数据以及它们的变体,不用于 float、double 或者 long 等复杂的数据类型。

4 位移运算符

位移运算符用来将操作数向某个方向(向左或者右)移动指定的二进制位数。表 2 列出了 Java 语言中的两个位移运算符,它们都属于双目运算符。
 

表 2 位移运算符
运算符含义实例结果
»右移位运算符8»14
«左移位运算符9«236

左位移运算符

左移位运算符为«,其运算规则是:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。

例如,将整数 11 向左位移 1 位的过程如图 6 所示。
 


图 6  对11左移1位运算过程


从图 6 中可以看到,原来数的所有二进制位都向左移动 1 位。原来位于左边的最高位 0 被移出舍弃,再向尾部追加 0 补位。最终到的结果是 22,相当于原来数的 2 倍。

右位移运算符

右位移运算符为»,其运算规则是:按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补零。

例如,将整数 11 向右位移 1 位的过程如图 7 所示。
 


图 7  对11右移1位运算过程


从图 7 中可以看到,原来数的所有二进制位都向右移动 1 位。原来位于右边的最低位 1 被移出舍弃,再向最高位追加 0 补位。最终到的结果是 5,相当于原数整除 2 的结果。

5. 复合位赋值运算符

所有的二进制位运算符都有一种将赋值与位运算组合在一起的简写形式。复合位赋值运算符由赋值运算符与位逻辑运算符和位移运算符组合而成。表 3 列出了组合后的复合位赋值运算符。
 

表3 复合位赋值运算符
运算符含义实例结果
&=按位与赋值num1 &= num2等价于 num 1=num 1 & num2
|=按位或赋值num1 |= num2等价于 num 1=num 1 | num2
^=按位异或赋值num1 ^= num2等价于 num 1=num 1 ^ num2
-=按位取反赋值num1 ~= num2等价于 num 1=num 1 ~ num2
«=按位左移赋值num1 «= num2等价于 num 1=num 1 « num2
»=按位右移赋值num1 »= num2等价于 num 1=num 1 » num2
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值