操作符    3.10 按位操作符

    3.10 按位操作符

       按位操作符用来操作整数基本数据类型中的单个“ 比特 ” (bit),即二进制位。按位操作符会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果。

       按位操作符来源于C语言面向底层的操作,在这种操作中经常需要直接操纵硬件,设置硬件寄存器内的二进制位。

       Java的设计初衷是嵌入电视机机顶盒内,所以这种面向底层的操作仍被保留了下来。但是,人们可能不会过多地用到位操作符。

       如果两个输入为都是 1,则按位 “ 与 ”操作符(&)生成一个输出位 1;否则生成一个输出位 0.

       如果两个输入位里只要有一个是 1,则按位“ 或 ”操作符 (|)生成一个输出位 1;

       只有在两个输入位都是 0 的情况下,它才会生成一个输出位 0。

       如果输入位的某一个是 1,但不全都是 1,那么按位“ 异或 ” 操作 (^)生成一个输出位 1.

       按位“ 非 ”(~),也称为取反操作符,它属于一元操作符,只对一个操作数进行操作(其他按位操作符是二元操作符)。

       按位“ 非 ”生成输入位相反的值——若输入 0,则输出1,若输入1 ,则输出 0。

       按位操作符和逻辑操作符都是使用了同样的符号,因此我们能方便地记住他们的含义:由于为是非常小的,所以按位操作符仅使用了一个字符。

        按位操作符可与等号(=)联合使用,以便合并运算和赋值:&=、|=和^=都是合法的(由于“~”是一元操作符,所以不可与“=”联合使用)。

        我们将布尔类型作为一种单比特值对待,所以它多少有些独特。我们可对它执行按位“ 与 ”、按位“ 或 ”和按位“ 异或 ”运算,但不能执行按位“ 非 ”(大概是为了避免与逻辑NOT混淆)。对于布尔值,按位操作符具有与逻辑操作符相同的效果,只是它们不会中途“短路”。此外,针对布尔值进行的按位运算为我们新增了一个“异或”逻辑操作符,它并未包括在“逻辑”操作符的列表中。在移位表达式中,不能用布尔运算,原因将在后面解释。

    3.11 移位操作符

        移位操作符操作的运算对象也是二进制的“ 位 ”。移位操作符只可用来处理整数类型(基本类型的一种)。左移位操作符(<<)能按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补 0)。“有符号”右移位操作符(>>)则按照操作符右侧指定的位数将操作符左边的操作数向右移动。

       “有符号”右移位操作符使用“ 符号扩展 ”:若符号为正,则高位插入 0;若符号为负,则高位插入 1。

       Java中增加了一种“ 无符号 ”右移位操作符(>>>),它使用“ 零扩展 ”:无论正负,都在高位插入 0.这一操作符是C或C++中没有的。

       如果对char、byte或者short类型的数值进行移位处理,那么在移位进行之前,它们会被转换为int类型,并且得到的结果也是一个int类型的值。只有数值右端的低5位才有用。这样可防止我们移位超过int型值所具有的位数。(译注:因为2的5次方为32,而int型值只有32位。)若对一个long类型的数值进行处理,最后得到的结果也是long。此时只会用到数值右端的低6位,以防止移位超过long型数值具有的位数。

      “移位”可与“等号”(<<=或>>=或>>>=)组合使用。此时,操作符左边的值会移动由右边的值指定的位数,再将得到的结果赋给左边的变量。但在进行“无符号”右移位结合赋值操作时,可能会遇到一个问题:如果对byte或short值进行这样的移位运算,得到的可能不是正确的结果。它们会先被转换为int类型,再进行右移操作,然后被截断,赋值给原来的类型,在这种情况下可能得到一个-1的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值