JAVA常见位运算(总结)
程序员文章站
2022-07-15 14:29:14
...
代码演示:
package com.lsj.test.lsj_pro.dataType.bitCalc;
public class TestBitCalc {
public static void main(String[] args) {
/*
* 2 =======> 00000000 00000000 00000000 00000010
* 3 =======> 00000000 00000000 00000000 00000011
*/
// 2^3======> 00000000 00000000 00000000 00000001, 结果就是1
System.out.println("2^3运算的结果是:"+orCalc(2,3));
// 2&3======> 00000000 00000000 00000000 00000010, 结果是 :2
System.out.println("2&3运算的结果是:"+andCalc(2, 3));
// 2<<3=====> 00000000 00000000 00000000 00010000, 结果是 :16
System.out.println("2<<3运算的结果是:"+leftMove(2, 3));
/*
* 5
*
* 00000000 00000000 00000000 00000101 --原码
* 00000000 00000000 00000000 00000010 --右移(2)
* 00000000 00000000 00000000 00000010 --无符号右移(2)
*/
int a = 5;
int a1 = righMove(a, 1);
int a2 = varRightMove(a, 1);
System.out.println("5>>1运算的结果是:"+a1); //2
System.out.println("5>>>1运算的结果是:"+a2); //2
System.out.println(a1+"--"+a2); //2--2
/*
* -5
*
* 10000000 00000000 00000000 00000101 --原码(第一位为符号位,1表示为负数)
* 11111111 11111111 11111111 11111010 --反码(原码取反)
* 11111111 11111111 11111111 11111011 --补码(反码加1,这是-5的十进制表达)
*
* 11111111 11111111 11111111 11111101 --右移(-3)(这是将-5的十进制右移后的十进制结果,也就是-3的十进制,可以看做是补码)
* 11111111 11111111 11111111 11111100 --右移(这是反码:补码减1)
* 10000000 00000000 00000000 00000011 --右移(-3)(这是原码:补码取反,这时候可以读出来为-3)
*
* 01111111 11111111 11111111 11111101 --无符号右移(2147483645)
*/
int b = -5;
int b1 = righMove(b, 1);
int b2 = varRightMove(b, 1);
System.out.println("-5>>1运算的结果是:"+b1);
System.out.println("-5>>>1运算的结果是:"+b2);
System.out.println(b1+"--"+b2); //-3--2147483645
/*
* 总结:
* 1.>> 需考虑符号位
* 2.>>> 不考虑符号位,缺少的位数补0
*
*/
}
/**
* 1.^(亦或运算) ,针对二进制,相同的为0,不同的为1
* @param a
* @param b
*/
public static int orCalc(int a, int b) {
return a^b;
}
/**
* 2.&(与运算) 针对二进制,只要有一个为0,就为0
* @param a
* @param b
*/
public static int andCalc(int a, int b) {
return a&b;
}
/**
* 3.<<(向左位移) 针对二进制,a转换成二进制后向左移动b位,后面用0补齐;
* 数学意义:
* 在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
* @param a
* @param b
*/
public static int leftMove(int a, int b) {
return a<<b;
}
/**
* 4.>>(向右位移) 针对二进制,a转换成二进制后向右移动b位;
* 如果a是正数,空位补0;如果a是负数,空位补1
* 数学意义:
* 右移一位相当于除2,右移n位相当于除以2的n次方。这里是取商哈,余数就不要了。
* @param a
* @param b
*/
public static int righMove(int a, int b) {
return a>>b;
}
/**
* 5.>>>(无符号右移) 无符号右移:
* 针对二进制,a转换成二进制后向右移动b位,忽略符号位,空位都以0补齐;
* 补充:
* 10进制转二进制的时候,因为二进制数一般分8位、 16位、32位以及64位 表示一个十进制数,所以在转换过程中,最高位会补零。
* 在计算机中负数采用二进制的补码表示,10进制转为二进制得到的是源码,将源码按位取反得到的是反码,反码加1得到补码
* 二进制的最高位是符号位,0表示正,1表示负。
* >>>与>>唯一的不同是它无论原来的最左边是什么数,统统都用0填充。
* @param a
* @param b
*/
public static int varRightMove(int a, int b) {
return a>>>b;
}
}
如果有不恰当的地方,欢迎指正。
上一篇: 3518. 进化序列(evolve)
下一篇: 位运算经典例题剖析