/**
 * 测试移位运算符<br/>
 * "<<" 左移 : 右侧补0<br/>
 * ">>" 带符号右移 : 左侧补符号位:正数补0,负数补1<br/>
 * ">>>"无符号右移 : 左侧补0<br/>
 */
public class TestShift {
	public static void main(String[] args) {
		testLeftShift();
		testRightShift();
		testUnsignedRightShift();
	}

	/**
	 * 左移: 右侧补0
	 */
	public static void testLeftShift(){
		int num = -8;
		int shift = 2;
		leftShift(num, shift);
		leftShift(-num, shift);
		System.out.println("--------------");
	}
	/**
	 * 左移: 右侧补0
	 */
	public static void leftShift(int num, int shift){
		// num 左移 shift位
		int r = num << shift;
		System.out.println("向左移位: "+ num +" << "+shift);
		System.out.println("移位前:"+binary(num));
		System.out.println("移位后:"+binary(r));
		System.out.println("");
	}
	/**
	 * 测试带符号右移: 左侧补符号位
	 */
	public static void testRightShift(){
		int num = -8;
		int shift = 2;
		rightShift(num, shift);
		rightShift(-num, shift);
		System.out.println("--------------");
	}
	/**
	 * 带符号右移: 左侧补符号位
	 */
	public static void rightShift(int num, int shift){
		// num 左移 shift位
		int r = num >> shift;
		System.out.println("(带符号)向右移位: "+ num +" >> "+shift);
		System.out.println("移位前:"+binary(num));
		System.out.println("移位后:"+binary(r));
		System.out.println("");
	}
	/**
	 * 测试右移: 左侧补0
	 */
	public static void testUnsignedRightShift(){
		int num = -8;
		int shift = 2;
		unsignedRightShift(num, shift);
		unsignedRightShift(-num, shift);
		System.out.println("--------------");
	}
	/**
	 * 右移: 左侧补0
	 */
	public static void unsignedRightShift(int num, int shift){
		// num 左移 shift位
		int r = num >>> shift;
		System.out.println("无符号向右移位: "+ num +" >>> "+shift);
		System.out.println("移位前:"+binary(num));
		System.out.println("移位后:"+binary(r));
		System.out.println("");
	}

	public static String binary(int  i){
		return alignRight(Integer.toBinaryString(i),32,'0');
	}
	/**
	 * 向右对齐
	 * @param str 原始字符串
	 * @param digit 需要的总位数
	 * @param addChar 添加的字符
	 * @return
	 */
	public static String alignRight(String str, int digit, char addChar){
		str = String.valueOf(str);
		digit = digit > 0 ? digit : 0;

		StringBuilder builder = new StringBuilder(digit);
		builder.append(str);

		for (int len = str.length(); len < digit; len++) {
			builder.insert(0, addChar);
		}
		//
		return builder.toString();
	}
}

关于Java的移位运算符的更多相关文章

  1. Java的移位运算符

    1.左移运算符:<< 丢弃左边指定位数,右边补0. 注意: 当int类型进行左移操作时,左移位数大于等于32位操作时,会先求余(%)后再进行左移操作.也就是说左移32位相当于不进行移位操作 ...

  2. Java 基础--移位运算符

    移位运算符就是在二进制的基础上对数字进行平移.按照平移的方向和填充数字的规则分为三种: <<(左移).>>(带符号右移)和>>>(无符号右移). 1.左移 按 ...

  3. Java:Java的<<<移位运算符详解

    1) 左移运算(<<)       左移就是把所有位向左移动几位 如:   12 << 2    意思就是12向左移动两位 12的二进制是: 0000 1100 通过这个图我们 ...

  4. java中移位运算符:<<、>>和>>>之间的比较

    一.说明 <<:运算符将二进制位进行左移操作 >>:运算符将二进制位进行右移操作 >>>:运算符将用0填空高位 二.举例 /** * *----------c ...

  5. java中的移位运算符:<<,>>,>>>总结

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  6. java 移位运算符

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  7. Java中的移位运算符

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  8. 移位运算符(JAVA)

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>     :     右移运算符,num >&g ...

  9. java移位运算符具体解释

    java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和>>>(无符号右移). 1. 左移运算符 左移运算符<<使指定值的全部位都左移 ...

随机推荐

  1. Qone 正式开源,使 javascript 支持 .NET LINQ

    Qone 下一代 Web 查询语言,使 javascript 支持 LINQ Github: https://github.com/dntzhang/qone 缘由 最近刚好修改了腾讯文档 Excel ...

  2. js生成四位随机数的简便方法

    do out = Math.floor(Math.random()*10000); while( out < 1000 ) alert( out );

  3. 18. 4Sum(中等)

    Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...

  4. 561. Array Partition I

    Given an array of 2n integers, your task is to group these integers into n pairs of integer, say \(( ...

  5. python 函数递归

    ##recursive递归 递归特性:1. 必须有一个明确的结束条件2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通 ...

  6. centos6 网卡配置,多IP设置

    ##云服务器 centos6网卡配置 #设置出口IP vim /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=seth0 #网卡名称 BOOTPROTO ...

  7. Linux 虚存的性能问题

    虚存子系统是所有 UNIX 系统的核心组件.下面讨论虚存系统的实现及其对操作系统中几乎其他所有子系统的作用和影响.首先详细说明一些基本的内存管理问题:然后具体分析 Linux 操作系统如何实施虚存管理 ...

  8. 分布式一致性协议Raft原理与实例

    分布式一致性协议Raft原理与实例 1.Raft协议 1.1 Raft简介 Raft是由Stanford提出的一种更易理解的一致性算法,意在取代目前广为使用的Paxos算法.目前,在各种主流语言中都有 ...

  9. Java对象的内存布局以及对象所需内存大小计算详解

    1. 内存布局 在HotSpot虚拟机中,对象的内存布局可以分为三部分:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 1) 对象头(Header): ...

  10. ZooKeeper之(六)应用实例

    6.1 Java API 客户端要连接 Zookeeper服务器可以通过创建 org.apache.zookeeper.ZooKeeper 的一个实例对象,然后调用这个类提供的接口来和服务器交互. Z ...