`

java 位操作符 移位操作符

阅读更多

 

 1.位操作符

 

       按位操作符和逻辑操作符使用的是相同的符号,所以理解起来也还好。

      按位操作符操作的是比特(bit),就是二进制位这些东西(“1001010100”)

 

      简单说一下进制转换二进制转十进制  :

       1字节 byte 占8位(bit) :0000 1011 = 1*1 + 1*2 +0*4 + 1* 8 = 11;

        一个字节最大值   0111 1111 = 127      0位表示该字节是正数

 

        注意:数字在计算机中是以二进制补码形式保存的,正数的原码、补码都是一样的,而负数的补码是其绝对值反码加1。因此,正整数的二进制转换比较容易,负整数就醉了。

      

     二元操作符:

     “&”  在位运算的时候就是并且的意思 ,下面根据&操作符规则进行 二进制的相加

	public static void main(String[] args) {
		// 十进制            二进制
		int a = 10;     // 0000 0000 0000 0000 0000 0000 0000 1010
		int b = 6;      // 0000 0000 0000 0000 0000 0000 0000 0110
		int c = a & b;  // 0000 0000 0000 0000 0000 0000 0000 0010

		System.err.println(c); // 输出 :2

	}

 

    “|”   在位运算的时候是或者的意思,下面根据|操作符规则进行 二进制的相加

	public static void main(String[] args){
		// 十进制                 二进制
		int a = 10;        // 0000 0000 0000 0000 0000 0000 0000 1010
		int b = 6;         // 0000 0000 0000 0000 0000 0000 0000 0110
		// 因为|是二元运算符 所以可以这样写 参照(a+=b)理解
		a |= b;            // 0000 0000 0000 0000 0000 0000 0000 1110

		System.err.println(a); // 输出:14
	}

 

     “^" 在位运算的时候是异或者的意思。不理解-6的二进制?结合下面”~“案例研究下吧

	public static void main(String[] args) {
		// 十进制                   二进制
		int a = 10;       // 0000 0000 0000 0000 0000 0000 0000 1010
		int b = 6;        // 0000 0000 0000 0000 0000 0000 0000 0110
		int c = a ^ b;    // 0000 0000 0000 0000 0000 0000 0000 1100
		System.err.println(c); // 输出:12

		int aa = 10;      // 0000 0000 0000 0000 0000 0000 0000 1010
		int bb = -6;      // 1111 1111 1111 1111 1111 1111 1111 1010
		int cc = aa ^ bb; // 1111 1111 1111 1111 1111 1111 1111 0000
		System.err.println(cc); // 输出:-16

	}

 

 

    一元操作符:

    "~" (非) 顾名思义就是取反的意思了

	public static void main(String[] args) {
		/**
		 * 推一下-10 的补码
		 * 0000 0000 0000 0000 0000 0000 0000 1010  10的补码
		 * 1111 1111 1111 1111 1111 1111 1111 0101  反码
		 * 1111 1111 1111 1111 1111 1111 1111 0110  反码+1 = -10补码
		 */
		// 十进制                            二进制
		int c = -10;//  1111 1111 1111 1111 1111 1111 1111 0110       补码 
		int d = ~c; //  0000 0000 0000 0000 0000 0000 0000 1001        求反的结果
		System.err.println(d); // 输出:9
		
		int a = 10; //  0000 0000 0000 0000 0000 0000 0000 1010        补码   
		int b = ~a;	//  1111 1111 1111 1111 1111 1111 1111 0101        求反的结果	
		System.err.println(b); // 输出:-11
		/**
		 *  根据b的补码 反推 b所代表的10进制数
		 *  1111 1111 1111 1111 1111 1111 1111 0100  补码-1  
		 *  0000 0000 0000 0000 0000 0000 0000 1011  求反  十进制11  因为b的补码首位是1  代表负数  
		 */
		
	}

 

 

  

 2.移位操作符

     移位是运算的对象是二进制的“位”

 

     1. 左移操作符(<<) 按照右侧指定的位数,将左边操作二进制数向左移动 (正负都是)低位补0

	public static void main(String[] args) {
		
		int i = 3;  // 0000 0000 0000 0000 0000 0000 0000 0011
		i <<= 2;    // 0000 0000 0000 0000 0000 0000 0000 1100 左移两位 补零
		System.err.println(i); // 输出:12
		int a = -3; // 1111 1111 1111 1111 1111 1111 1111 1101
		a <<= 2;    // 1111 1111 1111 1111 1111 1111 1111 0100 补码-1 求反
		System.err.println(a); // 输出:-12
		
	}

 

 

 

     如果对 char 、byte、short 类型进行移位,移位前会转为int类型 结果也是int型。

     int 类型移位超过32 位  按移位数%32 取余移位

     long 类型 结果还是 long  

     long 类型移位超过64 位 按移位数%64 取余移位

     移位只有:long、int  

	public static void main(String[] args) {

		int a = 2;
		byte b = 2;
		char c = 2;
		short d = 2;
		double e = 2;
		long f = 2;

		System.err.println(a << 3); // 输出16

		System.err.println(a << 35); // 输出16
		System.err.println(b << 35); // 输出16
		System.err.println(c << 35); // 输出16
		System.err.println(d << 35); // 输出16
		// System.err.println(e << 35); 无法编译
		System.err.println(f << 35); // 输出168719476736
		System.err.println(f << 3);  // 输出16
		System.err.println(f << 67); // 输出16

	}

 

 

    2. 右移操作符(>>) 按照右侧指定的位数,将左边操作二进制数向右移动 高位正补0 负补1

	public static void main(String[] args) {
		int i = 11;  // 0000 0000 0000 0000 0000 0000 0000 1011     
		i>>=2;       // 0000 0000 0000 0000 0000 0000 0000 0010     右移两位 补零
		System.err.println(i); // 输出:2
				
		int a = -11; // 1111 1111 1111 1111 1111 1111 1111 0101
		a>>=2;       // 1111 1111 1111 1111 1111 1111 1111 1101      补码-1 求反 
		System.err.println(a); // 输出:-3  
	}

 

 

    3.  无符号右移操作符(>>>) 按照右侧指定的位数,将左边操作二进制数向右移动 无论正负都在高位补0

         实际对正数没什么影响  负数就又醉了。。

	public static void main(String[] args) {
		int i = 11;   // 0000 0000 0000 0000 0000 0000 0000 1011     
		i>>>=2;       // 0000 0000 0000 0000 0000 0000 0000 0010     右移两位 补零
		System.err.println(i); // 输出:2
				
		int a = -11;  // 1111 1111 1111 1111 1111 1111 1111 0101  
		a>>>=2;       // 0011 1111 1111 1111 1111 1111 1111 1101      右移两位 补零
		System.err.println(a); // 输出:1073741821 
		System.err.println(Integer.toBinaryString(a)); //输出:11 1111 1111 1111 1111 1111 1111 1101
		
		int b = -11;  // 1111 1111 1111 1111 1111 1111 1111 0101  
		b>>>=30;      // 0000 0000 0000 0000 0000 0000 0000 0011      右移30位 补零
		System.err.println(b); // 输出:3
	}
4
1
分享到:
评论

相关推荐

    java 移位操作符的使用

    Java中的移位操作符用于对二进制数进行左移()、右移(&gt;&gt;)和无符号右移(&gt;&gt;&gt;)操作。 左移()操作符:将一个数的所有位向左移动指定的位数,右侧空出的位用0填充。 右移(&gt;&gt;)操作符:将一个数的所有位向右移动...

    Thinking in java4(中文高清版)-java的'圣经'

    3.5.1 一元加、减操作符 3.6 自动递增和递减 3.7 关系操作符 3.7.1 测试对象的等价性 3.8 逻辑操作符 3.8.1 短路 3.9 直接常量 3.9.1 指数记数法 3.10 按位操作符 3.11 移位操作符 3.12 三元操作符 if-else 3.13 ...

    详解Java的位操作符

    位操作就是对这些数据进行基本的操作。如果基本类型是char、byte或者short类型的数值进行移位处理,那么会转化成int类型,再进行移位的处理

    编程思想下篇

    3.2 使用Java操作符 3.3 优先级 3.4 赋值 3.4.1 方法调用中的别名问题 3.5 算术操作符 3.5.1 一元加、减操作符 3.6 自动递增和递减 3.7 关系操作符 3.7.1 测试对象的等价性 3.8 逻辑操作符 3.8.1 短路 3.9 直接常量 ...

    JavaScript中文参考手册

    移位操作符 逻辑操作符 简化运算 字符串操作符 特殊操作符 ?: (条件操作符) , (逗号操作符) delete new this typeof void 第三章 语句 这一章描述了所有 JavaScript 的语句。JavaScript 语句是用特定的...

    java基础案例与开发详解案例源码全

    3.4.5 位操作符49 3.4.6 移位运算符49 3.4.7 其他操作符50 3.5 表达式52 3.5.1 表达式简介52 3.5.2 表达式的类型和值52 3.5.3 表达式的运算顺序52 3.5.4 优先级和结合性问题52 3.6 选择结构54 3.6.1 顺序语句54 ...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    7.1.4 左移位和右移位操作符 7.2 掩码 7.3 软件工具:打印int值的二进制形式 7.4 包装和解包 7.5 枚举类型 7.6 例子:“石头、剪刀、布”游戏 7.7 总结 7.8 练习 第8章 预处理器 8.1 #include的使用 8.2 使用#define...

    JavaScript语言参考手册

    移位操作符 逻辑操作符 简化运算 字符串操作符 特殊操作符 ?: (条件操作符) , (逗号操作符) delete new this typeof void 第三章 语句 这一章描述了所有 JavaScript 的语句。JavaScript 语句是用特定的语法由...

    java学习总结 1.《Java核心技术》.rar

    3、移位操作符右边的参数要先进行模32运算(当左边的变元是long型,则模64),如1。浮点运算的中间结果程度是不一致的。有些处理器适用80bit浮点存储器,有些则使用64bit、80bit。直到最后才把结果截断为64bit,这样做...

    java 编程入门思考

    5.2 Java访问指示符 5.2.1 “友好的” 5.2.2 public:接口访问 5.2.3 private:不能接触 5.2.4 protected:“友好的一种” 5.3 接口与实现 5.4 类访问 5.5 总结 5.6 练习 第6章 类再生 6.1 合成的语法 6.2 继承的...

    Java初学者入门教学

    5.2 Java访问指示符 5.2.1 “友好的” 5.2.2 public:接口访问 5.2.3 private:不能接触 5.2.4 protected:“友好的一种” 5.3 接口与实现 5.4 类访问 5.5 总结 5.6 练习 第6章 类再生 6.1 合成的语法 6.2 继承的...

    java联想(中文)

    5.2 Java访问指示符 5.2.1 “友好的” 5.2.2 public:接口访问 5.2.3 private:不能接触 5.2.4 protected:“友好的一种” 5.3 接口与实现 5.4 类访问 5.5 总结 5.6 练习 第6章 类再生 6.1 合成的语法 6.2 继承的...

    JAVA_Thinking in Java

    5.2 Java访问指示符 5.2.1 “友好的” 5.2.2 public:接口访问 5.2.3 private:不能接触 5.2.4 protected:“友好的一种” 5.3 接口与实现 5.4 类访问 5.5 总结 5.6 练习 第6章 类再生 6.1 合成的语法 6.2 继承的...

    Java二进制操作(动力节点Java学院整理)

    给大家介绍了java二进制操作技巧,包括移位、位运算操作符等相关知识点,非常不错,感兴趣的朋友参考下吧

    Thinking in Java简体中文(全)

    5.2 Java访问指示符 5.2.1 “友好的” 5.2.2 public:接口访问 5.2.3 private:不能接触 5.2.4 protected:“友好的一种” 5.3 接口与实现 5.4 类访问 5.5 总结 5.6 练习 第6章 类再生 6.1 合成的语法 6.2 继承的...

    Thinking in Java 中文第四版+习题答案

    5.2 Java访问指示符 5.2.1 “友好的” 5.2.2 public:接口访问 5.2.3 private:不能接触 5.2.4 protected:“友好的一种” 5.3 接口与实现 5.4 类访问 5.5 总结 5.6 练习 第6章 类再生 6.1 合成的语法 6.2 继承的...

    Thinking in java(中文)

    控制程序流程 3.1 使用Java运算符 3.1.1 优先级 3.1.2 赋值 3.1.3 算术运算符 3.1.4 自动递增和递减 3.1.5 关系运算符 3.1.6 逻辑运算符 3.1.7 按位运算符 3.1.8 移位运算符 3.1.9 ...

    Java二进制操作指南

    和&gt;&gt;这两个操作符,示例如下:  /* 00000001 &lt;&lt; 1 xss=removed xss=removed xss=removed&gt;&gt; 4 = 11111111 11111111 11111111 11111111 */  0xFFFFFFF0 &gt;&gt; 4 == 0xFFFFFFFF  /* 00001111 11111111 1

    java范例开发大全

    实例13 Java中的进制与移位运算符 22 第3章 条件控制语句(教学视频:75分钟) 26 3.1 if控制语句 26 实例14 判断输入的年份是否为闰年 26 实例15 抽奖活动 27 3.2 for语句 28 实例16 小九九乘法表 28 实例17 如何列...

    java范例开发大全源代码

     实例13 Java中的进制与移位运算符 22  第3章 条件控制语句(教学视频:75分钟) 26  3.1 if控制语句 26  实例14 判断输入的年份是否为闰年 26  实例15 抽奖活动 27  3.2 for语句 28  实例16 ...

Global site tag (gtag.js) - Google Analytics