`
编程足球
  • 浏览: 250756 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

位移运算符

    博客分类:
  • java
 
阅读更多
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的位移运算符知识点 推荐初学者观看

    JavaScript位移运算符(无符号) &gt;&gt;&gt; 三个大于号 的使用方法详解

    主要介绍了JavaScript位移运算符(无符号) &gt;&gt;&gt; 三个大于号 的使用方法详解的相关资料,需要的朋友可以参考下

    JavaScript位移运算符(无符号) 三个大于号 的使用方法详解

    d3.bisector(accessor)是一种指定参数accessor或者比较器函数返回一个二等分对象。返回的对象有left和right两个属性。分别类似于bisectLeft和bisectRight方法。 这个方法适用于对象数组而不适用于原始的简单数组。...

    C语言运算符优先级整理收藏备用.docx

    C语言运算符优先级 在C语言中,运算符优先级定义了表达式中运算符的计算顺序。当一个表达式中有多个运算符时,高优先级的运算符会先被...7. **位移运算符 `和 `&gt;&gt;`**:进行位左移和位右移操作。 8. **关系运算符 `&lt;`

    C#中38个常用运算符的优先级的划分和理解

    3、位移运算符。4、比较运算符。5、逻辑运算符。6、各种赋值运算符。7、右位(后缀)单元运算符。 1、在这一级中,有++、–(做为前缀)、()、+、-(做为单元运算符)、!、~。这一级中都是单元运算符,除了其中那一对特殊...

    简介C++编程中的运算符重载

    所谓重载,就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义,使之实现新功能,因此,一个函数名就可以用来代表不同功能的...“是C++的位运算中的位移运算符(左移),但在输出操作中又是与流对 象cout

    基本语法.png

    Java基础:运算符、算数运算符、赋值运算符、关系运算符、逻辑运算符、条件运算符、位移运算符、条件运算符、下标运算符;整型字面量、浮点字面量、字符字面量、 布尔型字面量、引用字面量、类型字面量

    C#位移的介绍与例子

    C#位移运算符: 左移:&lt;&lt; 右移:&gt;&gt; 位移理解可能简单一些:其实就是数据转换成二进制的左右移动;右移左补0,左移右补0,后面多出来的部分去掉。 用乘除法去理解位移也可以:  左位移:相当于乘  左移1位相当...

    明解C语言(第3版)入门篇.[日]柴田望洋(带详细书签).pdf 【半高清】

    位移运算符 212 整型常量 216 整型常量的数据类型 218 整数的显示 218 数据溢出和异常 220 7-3 浮点型 221 浮点型 221 浮点型常量 223 头文件 224 循环的控制 225 7-4 运算和运算符 228 运算符的优先级...

    C#经验技巧宝典1-5

    0039 巧用位移运算符 20 0040 使用条件运算符 20 0041 巧用分隔符 20 0042 如何处理转义字符 21 0043 “;”结束符问题 21 0044 如何使用“??”操作符 22 2.4 表达式与关键词 22 0045 正确...

    javascript高级教程

    :)、位移运算符(|,&)和字符串运算符。  可能很多人不知道"==="什么。  在这里,我为大家解释一下,在javascript中 "==="才是全等 只有"==="两边的内存地址也相等 才会返回真  而"=="只是值相等就会返回真  例如...

    21天学通Java-由浅入深

    ”:非运算符 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 “&gt;&gt;”:带...

    JavaScript基础和实例代码

    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实例自学手册

    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基本语法

    :)、位移运算符(|,&,&lt;&lt;,&gt;&gt;,~,^)和字符串运算符(+)。 可能很多人不知道”===”是什么。 在这里,我为大家解释一下,在javascript中,“==”是等同运算符。 等同运算符的比较规则: 当两个运算数的类型不同时:...

    JavaScript入门基础

    :)、位移运算符(|,&,&lt;&lt;,&gt;&gt;,~,^)和字符串运算符(+)。 可能很多人不知道”===”什么。 在这里,我为大家解释一下,在javascript中 “===”才是全等 只有”===”两边的内存地址也相等 才会返回真 而”==”只是...

    C#编程经验技巧宝典

    19 &lt;br&gt;0038 巧用“^=”运算符 19 &lt;br&gt;0039 巧用位移运算符 20 &lt;br&gt;0040 使用条件运算符 20 &lt;br&gt;0041 巧用分隔符 20 &lt;br&gt;0042 如何处理转义字符 21 &lt;br&gt;0043 “;”结束符问题 21 ...

Global site tag (gtag.js) - Google Analytics