package com.lgf.operation;
/**
* 所有的整数类型(除了char 类型之外)都是有符号的整数。
* 这意味着他们既能表示正数,又能表示负数。Java 使用2的补码(two’s complement )
* 这种编码来表示负数,也就是通过将与其对应的正数的二进制代码取反(即将1变成0,将0变成1),然后对其结果加1。
* 例如,-42就是通过将42的二进制代码的各个位取反,即对00101010 取反得到11010101 ,然后再加1,得到11010110 ,即-42 。
* 要对一个负数解码,首先对其所有的位取反,然后加1。
* 例如-42,或11010110 取反后为00101001 ,或41,然后加1,这样就得到了42。
* @author lgf
*
*/
public class BitwiseOperators {
public static void main(String[] args) {
bitwiseNot();
bitwiseAnd();
bitwiseOr();
bitwiseXOR();
leftShiftOperator();
rightShiftOperator();
rightUnsignedShiftOperator();
}
/**
* ~ 按位非(NOT)(一元运算)
* 按位非也叫做补,一元运算符NOT“~”是对其运算数的每一位取反。
*/
public static void bitwiseNot(){
int x = 42; // x = 00000000000000000000000000101010
int y = ~x; // y = 11111111111111111111111111010101 = -43
x = -42; // x = 11111111111111111111111111010110
y = ~x; // y = 00000000000000000000000000101001 = 41
}
/**
* & 按位与(AND) 二元
* 按位与运算符“&”,如果两个运算数都是1,则结果为1。其他情况下,结果均为零。
*/
public static void bitwiseAnd(){
int x = 44; // x = 0101100
int y = 99; // y = 1100011
int z = x & y; // z = 0100000 = 1 * 2^5 = 32
x = - 44; // x = 11111111111111111111111111010100
y = 99; // y = 00000000000000000000000001100011
z = x & y; // z = 00000000000000000000000001000000 = 1 * 2^6 = 64
}
/**
* | 按或(OR) 二元
* 按位或运算符“|”,任何一个运算数为1,则结果为1
*/
public static void bitwiseOr(){
int x = 44; // x = 0101100
int y = 99; // y = 1100011
int z = x | y; // z = 1101111 = 111
x = - 44; // x = 11111111111111111111111111010100
y = 99; // y = 00000000000000000000000001100011
z = x | y; // z = 11111111111111111111111111110111 = -9
}
/**
* ^ 按位异或(XOR) 二元
* 按位或运算符 " ^ ",
* 如果两个运算数都是1,则结果为1。
* 其他情况下,结果均为零。
*/
public static void bitwiseXOR(){
int x = 44; // x = 0101100
int y = 99; // y = 1100011
int z = x ^ y; // z = 1001111 = 79
x = - 44; // x = 11111111111111111111111111010100
y = 99; // y = 00000000000000000000000001100011
z = x ^ y; // z = 11111111111111111111111110110111 = -73
}
/**
* 左移运算符<<使指定值的所有位都左移规定的次数。
* 它的通用格式如下所示: value << num 这里
* num 指定要移位值value 移动的位数。也就是,左移运算符<<使指定值的所有位都左移num位。
* 每左移一个位,高阶位都被移出(并且丢弃),并用0填充右边。
* 这意味着当左移的运算数是int 类型时,每移动1位它的第31位就要被移出并且丢弃;
* 当左移的运算数是long 类型时,每移动1位它的第63位就要被移出并且丢弃。
*
* 在对byte 和short类型的值进行移位运算时,你必须小心。
* 因为你知道Java 在对表达式求值时,将自动把这些类型扩大为 int 型,
* 而且,表达式的值也是int 型。对byte 和short类型的值进行移位运算的结果是int 型,
* 而且如果左移不超过31位,原来对应各位的值也不会丢弃。
* 但是,如果你对一个负的byte 或者short类型的值进行移位运算,它被扩大为int 型后,它的符号也被扩展。
* 这样,整数值结果的高位就会被1填充。因此,为了得到正确的结果,你就要舍弃得到结果的高位。
* 这样做的最简单办法是将结果转换为byte 型。下面的程序说明了这一点:
*/
public static void leftShiftOperator(){
int x = 11; // x = 1011
int y = x << 3; // y = 1011000
x = -11; //x = 11111111111111111111111111110101
y = x << 3; //y = 11111111111111111111111110101000
byte i = 64; // i = 001000000 64
int j = i << 2; // j = 100000000 256
byte z = (byte)(i << 2); // z = 00000000 0
int num = 0xFFFFFFE; // num = 00001111111111111111111111111110
//i = 0 num=00011111111111111111111111111100 536870908
for(i=0; i<5; i++) { //i = 1 num = 00111111111111111111111111111000 1073741816
num = num << 1; //i = 2 num = 01111111111111111111111111110000 2147483632
//printBinary(num); //i = 3 num = 11111111111111111111111111100000 -32
} // i = 4 num = 11111111111111111111111111000000 -64
num = -0xFFFFFFE; // num = 11110000000000000000000000000010 -268435454
// i = 0 num = 11100000000000000000000000000100 -536870908
for(i=0; i<5; i++) { // i = 1 num = 11000000000000000000000000001000 -1073741816
num = num << 1; // i = 2 num = 10000000000000000000000000010000 -2147483632
//printBinary(num); // i = 3 num = 00000000000000000000000000100000 32
} // i = 4 num = 00000000000000000000000001000000 64
}
/**
* 右移运算符>>使指定值的所有位都右移规定的次数。
* 它的通用格式如下所示: value >> num 这里,
* num 指定要移位值value 移动的位数。
* 也就是,右移运算符>>使指定值的所有位都右移num位
*
* 右移时,被移走的最高位(最左边的位)由原来最高位的数字补充。
* 例如,如果要移走的值为负数,每一次右移都在左边补1,
* 如果要移走的值为正数,每一次右移都在左边补0,
* 这叫做符号位扩展(保留符号位)(sign extension ),在进行右移操作时用来保持负数的符号
*/
public static void rightShiftOperator(){
int x = 35; // x = 100011 35
int y = x >> 2; // y = 1000 8
x = 32; // x = 100000
y = x >> 2; // y = 1000 8
x = -32; // x = 11111111111111111111111111100000 -32
y = x >> 2; // y = 11111111111111111111111111111000 -8
x = -1; // x = 11111111111111111111111111111111
y = x >> 2; // y = 11111111111111111111111111111111
}
/**
* 无符号右移运算符>>>
* 不管运算数的初值是什么,你希望移位后总是在高位(最左边)补0。
* 这就是人们所说的无符号移动(unsigned shift )。
* 这时你可以使用Java 的无符号右移运算符>>> ,它总是在左边补0。
*/
public static void rightUnsignedShiftOperator(){
int x = 35; // x = 100011 35
int y = x >>> 2; // y = 1000 8
x = 32; // x = 100000
y = x >>> 2; // y = 1000 8
x = -32; // x = 11111111111111111111111111100000 -32
y = x >>> 2; // y = 00111111111111111111111111111000 1073741816
x = -1; // x = 11111111111111111111111111111111
y = x >>> 2; // y = 00111111111111111111111111111111 1073741823
printBinary(y);
}
public static void printBinary(int i){
System.out.println("数值 " + i + " 对应的二进制为: " + Integer.toBinaryString(i) + " 一共:" + Integer.toBinaryString(i).length() + " 位");
}
}
分享到:
相关推荐
JavaScript的位移运算符知识点 推荐初学者观看
JavaScript中的位移运算符是编程中的一个重要概念,尤其在处理二进制数据和高效计算时。本文将深入探讨无符号右移运算符 `>>>`,并结合实例来解析其工作原理和使用方法。 位移运算符是基于二进制位进行操作的,它们...
d3.bisector(accessor)是一种指定参数accessor或者比较器函数返回一个二等分对象。返回的对象有left和right两个属性。分别类似于bisectLeft和bisectRight方法。 这个方法适用于对象数组而不适用于原始的简单数组。...
5. 位移运算符 * 运算符:、>> * 说明:对表达式进行左移或右移操作 * 结合方向:左到右 6. 关系运算符 * 运算符:>、>=、<、、==、!= * 说明:对表达式进行关系比较操作 * 结合方向:左到右 7. 按位运算符 ...
位运算符分为两大类:位逻辑运算符和位移运算符。位逻辑运算符包括按位与(AND)、按位或(OR)、按位异或(XOR)和按位非(NOT)。位移运算符则有右移(>>>和>>)和左移()。 1. **位逻辑运算符**: - **按位非...
运算符分为多种类型,包括赋值运算符、算术运算符、逻辑运算符、位逻辑运算符、位移运算符、关系运算符和自增自减运算符。 1. 赋值运算符: 赋值运算符以"="表示,如`count=5`,用于将右边的值赋予左边的变量。...
在 Python 中,运算符的优先级从上到下依次计算为:幂运算符 (), 算术运算符 ( *,/,//,%), 位移运算符 (,>>), 比较运算符 (>,<,>=,,==,!=), 布尔运算符 (and,or,not), 赋值运算符 (=) 等。括号可以用来改变运算符的...
这些运算符用于比较两个表达式的大小,优先级低于位移运算符。 13. **等于运算符 == 和不等于运算符 !=**: 用于检查两个表达式是否相等或不等,优先级低于关系运算符。 14. **按位与运算符 &、按位异或运算符 ^...
位移运算符允许我们将二进制数的位向左或向右移动指定的位数。 4. **关系运算符**:`(小于)、`(小于等于)、`>`(大于)、`>=`(大于等于)、`==`(等于)、`!=`(不等于)。关系运算符的优先级低于位逻辑运算符...
6. **Bitwise Shift Operators (位移运算符)** - **** (左移/右移): 用于位移操作。 - 示例: `int flags = 33 ;` 左移一位。 - 示例: `int flags = 33 >> 1;` 右移一位。 - **左至右关联性**: 表示同等级内...
8. **位移运算符** `<< >>`:位左移和位右移,常用于位操作。 9. **比较运算符** `< <= > >=` 和 **相等运算符** `== !=`:用于比较两个表达式的大小或是否相等。 10. **按位与** `&`、**按位异或** `^` 和 **按位或...
此外,位运算还包括位移运算符: - 左移运算符():将左操作数的二进制位向左移动指定的位数,右边补0。 - 右移运算符(>>):将左操作数的二进制位向右移动指定的位数,正数时左边补0,负数时左边补1。 例如,若A...
在这个例子中,位移运算符 `的优先级高于加法运算符 `+`. 4. `100 / 25 * 16` 在这个例子中,除法运算符 `/` 的优先级高于乘法运算符 `*`. Python 运算符的优先级和结合性是理解 Python 编程的关键概念。只有正确地...
4. **位移运算符**: - `, `>>`:左移、右移运算。 5. **关系运算符**: - `, `, `>`, `>=`:小于、小于等于、大于、大于等于。 - `==`, `!=`:等于、不等于。 - `, `, `>`, `>=` 的优先级高于 `==`, `!=`。 6...
#### 第四至第十三等级:算术运算符、位移运算符、比较运算符、相等性比较、位逻辑运算符、逻辑运算符 这些运算符涵盖了常见的算术计算、位操作、比较和逻辑判断,如乘法 `*`、除法 `/`、模运算 `%`、加法 `+`、...
##### 位移运算符 (5) - **左移**: 将二进制位向左移动。 - 示例:`k - 结合方向:从左到右。 - **>> 右移**: 将二进制位向右移动。 - 示例:`l >> 3` - 结合方向:从左到右。 ##### 关系运算符 (6) - **> ...
根据运算符的不同类型,可以将其分为赋值运算符、算术运算符、逻辑运算符、关系运算符、位逻辑运算符、位移运算符、自增自减运算符等。 赋值运算符的作用是将某个常量或变量或表达式的值赋值给另一个变量。符号为...
加法(+)和减法(-)的优先级低于乘法和除法,但高于位移运算符(和>>),它们都是从左向右结合的。位移运算符用于按位左移和右移,如`a 将`a`的二进制位向左移动两位。 关系运算符(>、<、>=、、==、!=)用于比较两个值...
位运算符,如 AND (&), OR (|), XOR (^), NOT (~) 以及位移运算符 (, >>, >>>),作用于整数类型的二进制表示。位运算符直接操作二进制位,例如 `a & b` 会返回 `a` 和 `b` 的二进制与运算结果。位移运算符会改变数字...
它们的优先级高于位移运算符,从左向右结合。 复合赋值运算符如"+="、"-="、"*="、"/="、"%="、"、">>="、"&="、"^="和"|=",它们的优先级低于算术运算符,但高于单个赋值运算符"="。复合赋值运算符会先执行相应的...