逻辑运算符和位运算符介绍 附带速记卡

2024-03-23 05:08

本文主要是介绍逻辑运算符和位运算符介绍 附带速记卡,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

逻辑运算符“&”、“|”、“~”、^ ;位运算符“<<”、“>>”和“>>>”介绍 附带速记卡

在想充分了解本章之前,你应当掌握以下知识点

  • 什么是 bit 比特            | 二进制用1和0表示数据,1个1或者1个0就是一个bit,它是计算机最小存储单位

  • 十进制转二进制表示方式               | 可参考本人博文 进制转换

  • java中基本数据类型中,每种(如int byte long)类型占多少字节,多少比特位?

  • 正负数二进制如何表示,什么是符号位,相关知识点
    可参考本人博文 二进制中原码,反码和补码是什么


java运算符体系

在这里插入图片描述

特别说明:

逻辑运算符“&”、“|”、“~”、^,它们本质上也是对位Bit的操作,所以在很多博文中也称它们为位运算符 ;
位运算符“<<”、“>>”和“>>>”,本质上是对位Bit的移动操作,所以大家也称为位移运算符
当然,不管怎么称呼,我们想弄清的都是它的功能。

逻辑运算符速记卡
在这里插入图片描述

虽然上图中,已经很明确说明,位运算符是带符号位参与的,但负数和正数通过位运算符计算时,你得明白一点: 负数和正数进行位运算时,是通过补码来计算的,并非原码

下面,是我撸过的代码

public static void main(String[] args) {int  i =-5;int j =4 ;System.out.println("i="+Integer.toBinaryString(i));System.out.println("j="+Integer.toBinaryString(j));int a =i&j;int b =i|j;int c=i^j;System.out.println("a="+Integer.toBinaryString(a));System.out.println("b="+Integer.toBinaryString(b));System.out.println("c="+Integer.toBinaryString(c));System.out.println("a="+a+"#b="+b+"#c="+c);}    

输出结果为:

i=11111111111111111111111111111011
j=100
a=0
b=11111111111111111111111111111111
c=11111111111111111111111111111111
a=0#b=-1#c=-1     

说明 : 第一行打印出来的 i=11111111111111111111111111111011 就是-5的返码

关于补码知识不了解的朋友 ,估计会看不懂,点击博文上面关于“ 二进制中原码,反码和补码是什么”的链接,让你get更多。


移位运算符速记卡

在这里插入图片描述

另外,位移动算符的截取,你应当知道

“>>” 从左边插入,截取从左边开始
“<<” 从右边插入,截取从右边开始
举例 byte 5 >>2 (byte类型占2个字节,8bit位)
用二进制表示为 0000 0101 从左添加2个0.变成了00 0000 0101
从左截取8位,得到0000 0000 转为十进制,为0


乘除法和位移运算符的关系

对于整形类型的乘除法,其实是可以用位移来代替原来的表达式,而且通过位移运算的效率是明显可以提高。

一般我们可以用2的n次方为基础,对原数据进行改写

如:
a=a * 9
分析a9可以拆分成a(8+1)即a8+a1, 因此可以改为: a=(a<<3)+a
a=a * 7
分析a7可以拆分成a(8-1)即a8-a1, 因此可以改为: a=(a<<3)-a

总结:a=a * n; n分解成(2^m + s),则a=a * n可以改为a=(a<<m)+a * s;a * s再同理分解替换。
例:a=a * 10 => a=a * (8+2) => a=a * 8 + a * 2 => a=(a<<3)+(a<<1)

这样做有俩个好处 :

  1. 改写后代码效率提高了
  2. 计算底层其实通过加减一套的运算方案,实现了乘除的代替。

同时,也要注意,这种改写其实只适用整型数值,另外,对于>>操作时,要格外要区分正负。

End!


在这里插入图片描述

这篇关于逻辑运算符和位运算符介绍 附带速记卡的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/837225

相关文章

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

Java逻辑运算符之&&、|| 与&、 |的区别及应用

《Java逻辑运算符之&&、||与&、|的区别及应用》:本文主要介绍Java逻辑运算符之&&、||与&、|的区别及应用的相关资料,分别是&&、||与&、|,并探讨了它们在不同应用场景中... 目录前言一、基本概念与运算符介绍二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. &:非短

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交