位运算总结(超全解释及代码演示)

        之前发了一篇关于位移运算的文章,只讲了位运算符的一部分知识,然而在学数据结构与算法中的布隆过滤器的时候,感觉不够用了,所以查资料补全该方面知识,便于复习和加深记忆


        为什么会认为位运算难呢?  (如果你是像我一样的新手,下面这段文字你值得一读!)

        起初我也是感觉位运算超难,后来才发现它比一加一还简单,我认为难得原因在于,我并没有弄清楚他的操作对象是什么,就像人类可以理解的加减乘除,它的操作对象是十进制数,这很容易理解。对于位运算、位运算就好比是计算机的加减乘除,又因为计算机只认识由0、1组成的二进制数,所以位运算的操作对象顾名思义就是二进制数本身(下面有证明,绿色标记)。


目录

首先说位逻辑运算符 :

再说位运算符:

位逻辑运算计算过程演示:

位逻辑运算代码演示:

比较位逻辑运算符和逻辑运算符:

逻辑运算符代码演示:


关键:在谈位运算符的时候,我们需要明白一个事情;位运算符的操作对象是什么?这很非常、非常的关键!!!——————二进制数的各个位置上的0或1;

百度百科对于位运算符的操作对象给出一下结论:


 了解了运算符的操作队对象后,接下来我们再去简单介绍一下什么是位运算符:

位运算符分为两种位逻辑运算符 和 位移运算符 。 


 首先说位逻辑运算符 :

此处有个加深记忆的方法——位逻辑运算符和逻辑运算符的不同:(最后展示)

这里编个口诀,        “ 与 1 或 0 ”   ,与的时候全为1结果才得1,或的时候全是0结果才是0;

再说位运算符:

位运算详解可以看这篇文章:

位移运算(“<<”和“>>”)详解_南斋孤鹤的博客-CSDN博客位移运算(“<<”和“>>”)详解https://blog.csdn.net/m0_64231944/article/details/126866111?spm=1001.2014.3001.5501

位逻辑运算计算过程演示:

A = 0011 1100

B = 0000 1101

-----------------

A&B   = 0000 1100

A | B   = 0011 1101

A ^ B  = 0011 0001

~A      = 1100 0011

如何理解他们是如何操作的呢?下面我们介绍A&B是如何计算的,其他的也就自然而然明白了。

A         = 0 0 1 1 1 1 0 0
B         = 0 0 0 0 1 1 0 1
A&B       = 0 0 0 0 1 1 0 0

        如上图:我们向A和B的二进制数的各个对应位标记为相同的颜色,我们对两个二进制数的位运算操作就是在相同颜色(相同位)上进行的。0&0=0、0&1=0、1&1=1、得出A&B的结果00001100;

位逻辑运算代码演示:

public class Demo1 {
    public static void main(String[] args) {
int a = 60; /* 60 = 0011 1100 */      
int b = 13; /* 13 = 0000 1101 */      
int c = 0;      
c = a & b;       /* 12 = 0000 1100 */      
System.out.println("a & b = " + c );  
 c = a | b;   /* 61 = 0011 1101 */
System.out.println("a | b = " + c );      
c = a ^ b;     /* 49 = 0011 0001 */
System.out.println("a ^ b = " + c );      
c = ~a;      /*-61 = 1100 0011 */
System.out.println("~a = " + c );        
    }
 } 

输出结果:

a & b = 12
a | b = 61
a ^ b = 49
~a = -61

         具体咋操作的呢?首先将十进制数转换为二进制数,然后在让两个二进制数的对应位置去单独进行位运算,最后得出结果。       

比较位逻辑运算符和逻辑运算符:

我们要明白,二者的操作对象是不同的,位运算符的操作对象是两个二进制数的对应位上的0或1

简单介绍下逻辑运算符:

逻辑运算符代码演示:

public class Test { 
public static void main(String[] args) { 
boolean a = true; boolean b = false; 
System.out.println("a && b = " + (a&&b)); 
System.out.println("a || b = " + (a||b) ); 
System.out.println("!(a && b) = " + !(a && b)); 
    } 
}

输出结果:

a && b = false
a || b = true!
(a && b) = true

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值