`

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;)操作符:将一个数的所有位向右移动...

    详解Java的按位操作符

    这些操作符可以分为两大类:按位逻辑操作符和移位操作符。 按位逻辑操作符 按位逻辑操作符是指对两个操作数的每一位进行布尔代数运算的符号。这些符号包括: * 与(&):对两个操作数的每一位进行AND运算,如果两...

    Java操作符的优先级和结合性

    以下是一个完整的Java操作符优先级列表: 1. 后缀运算符:`[ ]`、`.`、`( )`(函数调用) —— 这些操作符从左到右执行。例如,`array[index]`、`object.method()` 和 `(expression)`。 2. 单目运算符:`!`、`~`、...

    详解Java的位操作符

    本文将深入讲解Java中的位操作符,包括与(&)、或(|)、异或(^)、非(~)以及移位操作符。 首先,让我们来看看位操作符。Java提供了四种基本的位操作符: 1. **与(&)**:当两个操作数的相应位都是1时,结果的对应位才...

    java位运算符之左移操作视频

    左移操作符()是位运算符之一,它在Java中有着特定的应用和理解。本篇文章将深入探讨Java中的左移操作符及其相关知识点。 一、位运算符概述 位运算符直接作用于二进制位,它们包括:左移(),右移(&gt;&gt;),无符号...

    Java中的位运算

    左移位操作符(`)将操作数的所有位向左移动指定的位数,高位丢弃,低位补0。例如: ```java public class LeftMoving { public static void main(String[] args) { System.out.println("5(5 )); } } ``` 输出...

    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编程思想》学习笔记1(操作符、控制语句、对象、初始化与清理).doc

    **1.6 移位操作符** - **左移**: ` - **右移**: `&gt;&gt;` - **无符号右移**: `&gt;&gt;&gt;` **1.7 一元加减操作符** - **加**: `+` - **减**: `-` **1.8 自动递增递减运算符** - **前缀递增**: `++i` - **后缀递增**: `i++`...

    java基于移位操作实现二进制处理的方法示例

    Java语言中的移位操作是处理二进制数据时非常高效且强大的工具,它涉及到计算机底层的位运算。本文将深入探讨如何使用Java的移位操作来处理二进制,并通过示例代码展示其实现方法。 首先,我们来看一下Java中的移位...

    Java三种移位运算符原理解析

    Java移位运算符是Java编程语言中的一种基本操作符,主要用于对二进制数的移位操作。Java中有三种移位运算符:左移运算符()、带符号右移运算符(&gt;&gt;)和无符号右移运算符(&gt;&gt;&gt;)。下面我们将详细介绍这三种移位...

    颠倒二进制位1

    在这个问题中,我们可以使用右移位操作符(&gt;&gt;)和左移位操作符()来颠倒二进制位。右移位操作符可以将二进制位向右移位,例如将 00000010100101000001111010011100 右移一位将得到 ...

    浅析java移位符的具体使用

    浅析java移位符的具体使用 左移运算符() * 左移运算符的定义:左移运算符是一种二进制运算符,它将操作数的二进制码整理左移指定位数,左移后右面空出的位用0来补充。 * 左移运算符的原理:在计算机系统中,数值...

    EDA八位乘法的java实现

    Java提供了丰富的位操作符,如位与(&),位或(|),位异或(^),左移(),右移(&gt;&gt;), 无符号右移(&gt;&gt;&gt;), 位非(~)等。对于两个八位数的乘法,我们可以采用学校课本上经典的长乘法算法,将每个位进行逐位相乘,然后将结果...

    浅谈Java操作符与其优先级

    Java操作符及其优先级是编程过程中非常重要的概念,理解这些知识点可以帮助我们写出更高效、更准确的代码。本文将深入探讨Java中各种操作符的工作原理和优先级规则。 1. **赋值运算符**: Java中的赋值运算符`=`...

    CoreJava全套详细笔记资料.pdf

    * 运算符是Java语言中的基本操作符,用于执行各种操作。 * 移位运算符包括左移、右移和无符号右移,用于将数字移动到指定的位置。 * 位运算符包括按位与、按位或、按位异或和按位非,用于对数字进行二进制操作。 * ...

    Java中位运算(移位、位与、或、异或、非) 的简单实例

    5. **位或运算符 (|)**:位或运算符对两个操作数的每一位执行或操作。只要两个操作数的对应位中有1,结果的该位就为1。例如,`5 | 3`,在二进制表示中进行或操作后,结果为 `0000 0000 0000 0000 0000 0000 0000 ...

    编程思想下篇

    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 直接常量 ...

    JAVA笔记.docx

    本文将深入探讨Java的基础知识,包括DOS命令、JDK环境搭建、变量、注释和进制转换,以及移位操作符。 首先,DOS命令是Windows操作系统中的基本命令行工具,对于Java开发者来说,熟悉这些命令是非常必要的。例如,`...

    福富2010 Java 面试题

    * Java是一种跨平台的语言,Java程序可以在不同的操作系统中运行 * Java的跨平台主要是由于Java虚拟机(JVM)的存在 Socket编程 * Socket是指网络编程中的一个概念,用于实现网络通信 * Java中提供了多种Socket...

    JavaScript中文参考手册

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

Global site tag (gtag.js) - Google Analytics