ITPub博客

首页 > 数据库 > 数据库开发技术 > 位运算

位运算

原创 数据库开发技术 作者:yxkong 时间:2021-11-17 09:01:00 0 删除 编辑

机器数

一个数在计算机中的二进制表示形式,就是这个数的机器数。

  • 二进制显示

  • 高位存放符号,正数是0,负数是1

位运算法符

与运算符 &

两个位都为1则为1,否则为0

printFormat(101);printFormat(-101);printFormat(101&101);结果:0000 0000 0000 0000 0000 0000 0110 0101 1111 1111 1111 1111 1111 1111 1001 1011 0000 0000 0000 0000 0000 0000 0110 0101 
  • 同一个数&运算后还是本身

或运算符 |

两个位只要有一个为1,那么结果就是1,否则就为0

printFormat(101);printFormat(101|101);结果:0000 0000 0000 0000 0000 0000 0110 0101 0000 0000 0000 0000 0000 0000 0110 0101 
  • 同一个数|运算后还是本身

非运算符 ~

位为0,结果是1,位为1,结果是0

printFormat(101);printFormat(~101);结果:0000 0000 0000 0000 0000 0000 0110 0101 1111 1111 1111 1111 1111 1111 1001 1010 

异或运算符 ^

两个位相同则结果为0,否则结果为1

printFormat(101);printFormat(32);printFormat(101^32);结果:0000 0000 0000 0000 0000 0000 0110 0101 0000 0000 0000 0000 0000 0000 0010 0000 0000 0000 0000 0000 0000 0000 0100 0101 

位移

左移运算

左移运算符 << ,num << 1,相当于num乘以2

示例:101printFormat(101);printFormat(101<<1);结果:左移前:0000 0000 0000 0000 0000 0000 0110 0101 左移后: 0000 0000 0000 0000 0000 0000 1100 1010 
示例:-101printFormat(-101);printFormat(-101<<1);结果:左移前:1111 1111 1111 1111 1111 1111 1001 1011 左移后: 1111 1111 1111 1111 1111 1111 0011 0110
  • 正数左移,二进制左边移除1位,右边补0

  • 负数左移,二进制左边移除1位,右边补0

右移运算

右移运算符 >> ,num >> 1,相当于num除以

示例:101printFormat(101);printFormat(101>>1);结果:右移前: 0000 0000 0000 0000 0000 0000 0110 0101 右移后: 0000 0000 0000 0000 0000 0000 0011 0010 
示例:-101结果:右移前: 1111 1111 1111 1111 1111 1111 1001 1011 右移后: 1111 1111 1111 1111 1111 1111 1100 1101
  • 正数右移,二进制右边移除1位,左边补0

  • 负数右移,二进制右边移除1位,左边补1

无符号右移

无符号右移 >>>,忽略符号位,空位都以0补齐

无符号右移运算符和右移运算符是一样的,不过无符号右移运算符在右移的时候是补0的,而右移运算符是补符号位的

表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0

printFormat(101);printFormat(101>>>1);printFormat(-101);printFormat(-101>>>1);结果:右移前: 0000 0000 0000 0000 0000 0000 0110 0101 右移后: 0000 0000 0000 0000 0000 0000 0011 0010 右移前: 1111 1111 1111 1111 1111 1111 1001 1011 右移后: 0111 1111 1111 1111 1111 1111 1100 1101 
  • 正负数右移,左边补0

测试代码如下:

public class TestBase {    protected void printFormat(int n){        out(format(n));    }    protected void printFormat(long n){        out(format(n));    }    protected void out(Object obj){        System.out.println(obj);    }    protected void err(Object obj){        System.err.println(obj);    }    protected String format(long n){        return format(toBinaryString(n),64);    }    private String format(String str,int len){        if (len > str.length()){            str = String.format("%0"+(len - str.length())+"d",0)+str;        }        int i = 1;        StringBuilder sb = new StringBuilder();        for (char c:str.toCharArray()) {            sb.append(c);            if (i == 4){                sb.append(" ");                i = 0;            }            i++;        }        return sb.toString();    }    protected String format(int n){
return format(toBinaryString(n),32); } /** * 输出int类型的二进制 * @param n * @return */ protected String toBinaryString(int n){ return Integer.toBinaryString(n); }
/** * 输出long类型的二进制 * @param n * @return */ protected String toBinaryString(long n){ return Long.toBinaryString(n); }}


原文作者:5ycode;如有侵权,请联系管理员删除。

上一篇: c语言基础
请登录后发表评论 登录
全部评论

注册时间:2021-03-26

  • 博文量
    124
  • 访问量
    71509