JAVA语法--位运算

  位运算符有:<< , >> , >>> , & , | , ^ , ~

  下面通过实验来学习这几种运算

  以下的数据类型是 int 用32位表示,二进制右边的0省略

  // 21和-21的二进制表示

  System.out.println( Integer.toBinaryString(21));  // 10101

System.out.println(Integer.toBinaryString(-21)); // 11111111111111111111111111101011

  

  // << 带符号位向右移 移动n位即乘以2的n次方(输出结果为下面注释)

  System.out.println("21 << 4 : " + Integer.toBinaryString(21 << 4) + " to decimate: " + (21 << 4));

   // 21 << 4 : 101010000 to decimate: 336

  System.out.println("-21 << 4 : " + Integer.toBinaryString(-21 << 4) + " to decimate: " + (-21 << 4));

  // -21 << 4 : 11111111111111111111111010110000 to decimate: -336

  // >> 带符号位向左移 高位补符号位 移动n位即除以2的n次方(输出结果为下面注释)

  System.out.println("21 >> 3 : " + Integer.toBinaryString(21 >> 3)+ " to decimate: " + (21 >> 3));

  // 21 >> 3 : 10 to decimate: 2

  System.out.println("-21 >> 3 : " + Integer.toBinaryString(-21 >> 3)+ " to decimate: " +(-21 >> 3));

  // -21 >> 3 : 11111111111111111111111111111101 to decimate: -3

  // >>> 不带符号位左移 高位补0

  System.out.println("21 >>> 3 : " + Integer.toBinaryString(21 >>> 3) + " to decimate: " + (21 >>> 3));

  // 21 >>> 3 : 11111111111111111111111111101011 to decimate: 2

  System.out.println("-21 >>> 3 : " + Integer.toBinaryString(-21 >>> 3)+ " to decimate: " + (-21 >>> 3));

  // -21 >>> 3 : 11111111111111111111111111101 to decimate: 536870909

  System.out.println(Integer.parseInt("11111111111111111111111111101", 2)); // 转为十进制

  // 536870909

  // & 第一个操作数的第n位 与 第二个操作数的第n位 相同为1时为1  其他情况为 0

  System.out.println(4 & 1); // 100 & 1 = 0

  System.out.println(5 & 1); // 101 & 1 = 1

  System.out.println(5 & 3); // 101 & 11 = 1

  // | 第一个操作数的第n位 或 第二个操作数的第n位 其中一个为1就为1

  System.out.println(5 & 2); // 101 & 10 = 111 = 7

  // ^ 第一个操作数的第n位 异或 第二个操作数的第n位 相同为1  不同为0

  System.out.println(5 ^ 3); // 101 ^ 11 = 110 = 6

  

  // ~ 操作数的第n位为1,那么结果的第n位为0,反之。

  System.out.println(~5); // ~00101 = 11010 = -6

  (转~)应用:

  1.  判断int型变量a是奇数还是偶数    
       a&1  = 0 偶数 
       a&1 =  1 奇数 
  2.  求平均值,比如有两个int类型变量x、y,首先要求x+y的和,再除以2,但是有可能x+y的结果会超过int的最大表示范围,所以位运算就派上用场啦。
        (x&y)+((x^y)>>1); 
  3.  对于一个大于0的整数,判断它是不是2的几次方
      ((x&(x-1))==0)&&(x!=0); 
  4.  比如有两个int类型变量x、y,要求两者数字交换,位运算的实现方法:性能绝对高效
        x ^= y; 
        y ^= x; 
        x ^= y; 
  5. 求绝对值
      int abs( int x ){ 
         int y ; 
         y = x >> 31 ; 
       return (x^y)-y ;        //or: (x+y)^y 
     }
  6.  取模运算,采用位运算实现:
       a % (2^n) 等价于 a & (2^n - 1) 
  7.  乘法运算   采用位运算实现
       a * (2^n) 等价于 a << n
  8.   除法运算转化成位运算
        a / (2^n) 等价于 a>> n 
  9.   求相反数
        (~x+1) 
  10  a % 2 等价于 a & 1

时间: 2024-08-02 07:07:18

JAVA语法--位运算的相关文章

Java语法基础--运算

常量是一些不变的数据,我们用变量的方式把常量给记录下来,变量是内存中一个空间,空间中可以存储某些类型的数据,变量还有一个好处,就是可以给一些常量取名称,方便阅读: 取模运算 就是取余数.模2运算,非0即1,用于切换. -3%6结果是-3 . 3%-6结果是3 . 负数运算参考左边符号. 对于除号"/",它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分. 例如:int x=3510;x=x/1000*1000;  x的结果是3. 自增运算 ++ int a=3

JAVA 通过位运算进行简单的加密

我们可以通过一个简单的位运算进行简单的加密 import java.util.Scanner; public class Example{ public static void main(String[]args){ Scanner input = new Scanner(System.in); System.out.println("请输入一个英文字符或解密字符串"); //获取用户输入的字符 String password = scan.nextLine(); //使用String

Java的位运算

左移位操作 左移位运算的符号为[<<],左移位运算符左面的操作元称作被移位数,右面的操作数称作移位量. 左移位运算是双目运算符,操作元必须是整型类型的数据,其移动过程是:[a << n]运算的过程是通过将a的所有位都左移n位,每左移一个位,左边的最高位上的0或1被移出丢弃,并用0填充右边的低位 注意: 如果a是byte.short或int型数据,总是先计算出n%32的结果m,然后进行a<<m运算 对于long型数据,总是先计算出n%64的结果m,然后进行a <&l

JAVA中位运算简单入门

位运算是指将数转换为二进制后通过为的移动来改变数的大小. 1.&     按位与 相同位的两个数字都为1,则为1:若有一个不为1,则为0. 2.|     按位或 相同位只要一个为1即为1,否则为零. 3.^    按位异或 相同位 不同为1,相同则为0 4.~    按位取反 1的取0,0的取1 5.<<  左移 左移几位,后边添加几个0 也就是将数乘以2的几次方 6.>>  右移 右移几位,后边删除几位 也就是将数除以2的几次方 如果对数扩大或者缩小2的几次方倍,应该以

java中位运算^,&amp;,&lt;&lt;,&gt;&gt;,&lt;&lt;&lt;,&gt;&gt;&gt;

1.^(亦或运算) ,针对二进制,相同的为0,不同的为1 public static void main(String[] args) { System.out.println("2^3运算的结果是 :"+(2^3)); //打印的结果是: 2^3运算的结果是 :1 } 2 =======>0010 3 =======>0011 2^3就为0001,结果就是1 2.&(与运算) 针对二进制,只要有一个为0,就为0 还是上述的例子 public static void

java位运算

Java的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括long.int.short.char和 byte,位运算符具体如下表: 运算符 说明 << 左移位,在低位处补0 >> 右移位,若为正数则高位补0,若为负数则高位补1 >>> 无符号右移位,无论正负都在高位补0 & 与(AND),对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0. | 或(OR),对两个整型操作数中对应位执行布尔代数,两个位

leetcode:single-number-ii(Java位运算)

题目: Given an array of integers, every element appears three times except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 给定一个整型数组,每个数都出现了三次(只有一个数只出现了一次),找

Java基础-一文搞懂位运算

在日常的Java开发中,位运算使用的不多,使用的更多的是算数运算(+.-.*./.%).关系运算(<.>.<=.>=.==.!=)和逻辑运算(&&.||.!),所以相对来说对位运算不是那么熟悉,本文将以Java的位运算来详细介绍下位运算及其应用. 1. 位运算起源 位运算起源于C语言的低级操作,Java的设计初衷是嵌入到电视机顶盒内,所以这种低级操作方式被保留下来.所谓的低级操作,是因为位运算的操作对象是二进制位,但是这种低级操作对计算机而言是非常简单直接,友好高效

Java 位运算超全面总结

1.原码.反码.补码 关于原码.反码.补码的相关知识作者不打算在这里长篇大论,相关知识已有别的大佬总结很好了,还请老铁自行 Google,不过有篇知乎回答是作者学编程以来见过对相关知识最通俗易懂,生动简洁的解释:对原码.反码.补码最通俗易懂,生动简洁的解释,墙裂建议大家先看完这篇科普文章.在继续讨论之前你要先明白一点:整数在计算机内部都是以补码形式存储的. 2.Java 位运算概览 OK 都看到这儿了那我就假定你已经掌握了原码.反码.补码相关知识(虽然上面那段几乎啥也没讲,纯凑字数) 不废话了.