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方法。 这个方法适用于对象数组而不适用于原始的简单数组。...
C语言运算符优先级 在C语言中,运算符优先级定义了表达式中运算符的计算顺序。当一个表达式中有多个运算符时,高优先级的运算符会先被...7. **位移运算符 `和 `>>`**:进行位左移和位右移操作。 8. **关系运算符 `<`
3、位移运算符。4、比较运算符。5、逻辑运算符。6、各种赋值运算符。7、右位(后缀)单元运算符。 1、在这一级中,有++、–(做为前缀)、()、+、-(做为单元运算符)、!、~。这一级中都是单元运算符,除了其中那一对特殊...
所谓重载,就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义,使之实现新功能,因此,一个函数名就可以用来代表不同功能的...“是C++的位运算中的位移运算符(左移),但在输出操作中又是与流对 象cout
Java基础:运算符、算数运算符、赋值运算符、关系运算符、逻辑运算符、条件运算符、位移运算符、条件运算符、下标运算符;整型字面量、浮点字面量、字符字面量、 布尔型字面量、引用字面量、类型字面量
C#位移运算符: 左移:<< 右移:>> 位移理解可能简单一些:其实就是数据转换成二进制的左右移动;右移左补0,左移右补0,后面多出来的部分去掉。 用乘除法去理解位移也可以: 左位移:相当于乘 左移1位相当...
位移运算符 212 整型常量 216 整型常量的数据类型 218 整数的显示 218 数据溢出和异常 220 7-3 浮点型 221 浮点型 221 浮点型常量 223 头文件 224 循环的控制 225 7-4 运算和运算符 228 运算符的优先级...
0039 巧用位移运算符 20 0040 使用条件运算符 20 0041 巧用分隔符 20 0042 如何处理转义字符 21 0043 “;”结束符问题 21 0044 如何使用“??”操作符 22 2.4 表达式与关键词 22 0045 正确...
:)、位移运算符(|,&)和字符串运算符。 可能很多人不知道"==="什么。 在这里,我为大家解释一下,在javascript中 "==="才是全等 只有"==="两边的内存地址也相等 才会返回真 而"=="只是值相等就会返回真 例如...
”:非运算符 54 3.4.4 逻辑运算符总结 54 3.5 三元运算符 55 3.6 位运算符 55 3.6.1 “&”:按位与运算符 56 3.6.2 “|”:按位或运算符 56 3.6.3 “^”:按位异或运算符 57 3.7 位移运算符 57 3.7.1 “>>”:带...
2.7.4 位移运算符 2.7.5 自加和自减 2.7.6 比较运算符 2.7.7 逻辑运算符 2.7.8 逗号运算符 2.7.9 空运算符 2.7.10 ?...:运算符 2.7.11 对象运算符 2.7.12 typeof运算符 2.7.13 运算符优先级 2.8 核心语句 2.8.1 基本...
2.7.4 位移运算符 2.7.5 自加和自减 2.7.6 比较运算符 2.7.7 逻辑运算符 2.7.8 逗号运算符 2.7.9 空运算符 2.7.10 ?...:运算符 2.7.11 对象运算符 2.7.12 typeof运算符 2.7.13 运算符优先级 2.8 核心语句 2.8.1 基本...
:)、位移运算符(|,&,<<,>>,~,^)和字符串运算符(+)。 可能很多人不知道”===”是什么。 在这里,我为大家解释一下,在javascript中,“==”是等同运算符。 等同运算符的比较规则: 当两个运算数的类型不同时:...
:)、位移运算符(|,&,<<,>>,~,^)和字符串运算符(+)。 可能很多人不知道”===”什么。 在这里,我为大家解释一下,在javascript中 “===”才是全等 只有”===”两边的内存地址也相等 才会返回真 而”==”只是...
19 <br>0038 巧用“^=”运算符 19 <br>0039 巧用位移运算符 20 <br>0040 使用条件运算符 20 <br>0041 巧用分隔符 20 <br>0042 如何处理转义字符 21 <br>0043 “;”结束符问题 21 ...