运算符(上)
算术运算符
+、-、*、/、%(取余)
int a =3; int b =0; b=a/2; //需注意b是整型,3/2的值是1 //------------------------------------------------------- int a = 4; int b =0; b=a%2; //a%2,求的书4/2的余数,为0
赋值运算符
= 、+=、 -=、 /=、 *=、%=
int x=1; //把1赋给变量x x+=1; //类似于:x=x+1; //-------------------------------------------------------- byte x =1; x += 2; //+=类似于=,等号右边是常数,自动类型转化 int y =1; byte b =0; y += b; //+=类似于=,等号右边是常数,自动类型转化 x = (byte)(x+2); //不加byte编译报错,类型从int转化为byte可能有损失,可以看成等于右边为一个表达式,不做自动转化
关系运算符
>、<、>=、<=、==、!=、instanceof(用于比较一个对象是否属于一个类型)
关系运算符的结果为Boolean类型
逻辑运算符
&&(短路与)、&(逻辑与)、||(短路或)、|(逻辑或)、!(非)、^(逻辑异或)
短路与与逻辑与的区别在于,当第一个条件为假时,短路与会发生短路,后面的不执行,逻辑与不论是真还是假都会执行到最后;
短路或与逻辑或的区别在于,当第一个条件为真时,短路或会发生短路,后面的不执行,逻辑或不论是真还是假都会执行到最后
短路与和短路或在发生短路的情况下,性能才比逻辑与或者逻辑或更高
(3>1)^(3<2):前后两个表达式结果不同,那么最终结果为true,反之为false
位运算符
进制转换(扩展):
十进制转二进制:除2直到商为1,将余数倒序排列
二进制转十进制:每个元素乘以2的位数-1,求和
00000100 0*27 + 0*26+0*25 + 0*24 + 0*23 + 1*22 + 0*21 +0*20 = 4
八进制:以3个bit为一组,把每一组计算成十进制,开头加上数字0,作为标记。
16进制:以4个bit为一组,把每一组用二进制转十进制的方式方式,计算每一组的数,有些不同的是,10到15的数字,分别依次用A、B、C、D、E、F表示,开头加上0x(数字0,不是字母o),作为标记。
0010 1110
2 E
16进制:0x2E
&(按位与)、 |(按位或)、^(按位异或)、~(按位取反)、<<(按位左位移)、>>(按位右位移)、>>>【按位右位移(无符号)】
按位与运算,类似于把1看成真,0看成假,只有对应bit的数都为1,该bit结果才为1,其他都为0
9 & 1 == 1
00001001
00000001
00000001
按位或运算,类似于把1看成真,0看成假,只要对应bit位上有1,该bit结果才为1,其他为0
9 | 1 == 9
00001001
00000001
00001001
按位异或,类似于把1看成真,0看成假,当对应bit位上两个数不一样,该bit结果为1,其他为0
9 ^ 1 == 8
00001001
00000001
00001000
按位取反,在这,我们需要知道计算机中无论是正数还是负数,其在内存中的存储形式都是一补码的形式存储的,其中,正数的原码、反码、补码都是一样的(下面的二进制数也可以用 符号位+有效位 来代替 ,如 9的原码----—> 01001)
9
原码:00000000 00000000 00000000 00001001
反码:00000000 00000000 00000000 00001001
补码:00000000 00000000 00000000 00001001
-9
原码:10000000 00000000 00000000 00001001
反码:11111111 11111111 11111111 11110110(符号位不变,其余取反)
补码:11111111 11111111 11111111 11110111(反码+1)
~9 == -10
9的补码: 00000000 00000000 00000000 00001001
取反: 11111111 11111111 11111111 11110110
-1(因为求的是负数的原码): 11111111 11111111 11111111 11110101
“取反后的数”的原码(符号位不变,其余取反): 10000000 00000000 00000000 00001010
看起来有点绕,可以这样认为:找到了9的补码,先将9的补码取反(可以把它看成~9),再 - 1,最后符号位不变,其余取反(后面两步类似于求一个负数的补码的逆过程,是把取反后的数,这个数可看成你要求的数的补码,将这个数的补码转成原码的形式)
负数和正数的过程也差不多
~(-9) ==8
-9的补码: 11111111 11111111 11111111 11110111
取反: 00000000 00000000 00000000 00001000
“取反后的数”的原码(正数的原码、反码、补码相同): 00000000 00000000 00000000 00001000
按位左位移
6 << 2 == 24
00000000 00000000 00000000 00000110
类似于在之前的最右边加位移个数(即上面“6 << 2 ”的2)的0(无论正数还是负数),再把最左边的位移个数的数去掉(符号位不动,即去掉符号位之后的)
00000000 00000000 00000000 00011000
也先相当于,乘以2的位移次幂,即6 * 22 = 24
-6 << 2 == -24
-6的补码: 11111111 11111111 11111111 11111010
按位左位移运算: 11111111 11111111 11111111 11101000
符号位不变,其他位,取反:11111111 11111111 11111111 00010111
+1: 1000000 0000000 0000000 00011000
按位右位移
6 >> 1 == 3
00000000 00000000 00000000 00000110(6的补码)
类似于在之前的最右边减掉位移个数(即2)的0或1,在最左边加上位移个数的数的0(正数)或1(负数)(符号位不动,即类似于在符号位后加)
00000000 00000000 00000000 00000011
也先相当于,除以2的位移次幂,即6 / 21 = 3
-6 >> 1 == -3
-6的补码: 11111111 11111111 11111111 11111010
按位右位移运算: 11111111 11111111 11111111 11111101
符号位不变,其他位,取反: 10000000 00000000 00000000 00000010
+1: 10000000 00000000 00000000 00000011
所以,我们再做一些乘除法运算时,可以利用这些来做,提高计算机的计算效率
-6 >>> 1 == 2147483654
11111111 11111111 11111111 11111010(-6的补码)
类似于在之前的最右边砍掉位移个数的0或1(不考虑符号位,无论正数还是负数都直接在最左边补0)
011111111 11111111 11111111 1111101
注意:
位运算是用补码来进行的,正数的三码都一样,负数的三码是有区别,在&、|、~、<<、>>、>>>,中如果是负数的位运算,需要注意这一点
原文地址:https://www.cnblogs.com/wuxinxiaohuacai/p/12680880.html
- 周末阅读:程序员的《权利法案》
- 对利用Adobe 0day – CVE-2014-0502进行攻击的行为分析
- Android系统更改状态栏字体颜色
- Android实现竖着的滑动刻度尺效果,选择身高(竖向的)
- DedeCMS全版本通杀SQL注入漏洞利用代码及工具
- Android实现滑动刻度尺效果,选择身高体重和生日
- 浅谈开源web程序后台的安全性
- Web漏洞演练平台 – ZVulDrill
- Android内存泄漏终极解决篇(上)
- 走近科学:我是如何入侵Instagram查看你的私人片片的
- 在线手写识别的多卷积神经网络方法
- 苹果发布OS X 10.9.2更新,修复SSL漏洞
- Android内存泄漏终极解决篇(下)
- 利用Volatility查找系统中的恶意DLL
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Go by Example 中文:工作池
- 推荐一款万能抓包神器:Fiddler Everywhere
- 猿实战04——el-upload结合nginx之通用图片处理
- 30 多个有内味道且笑死的人代码注释
- Logstash-input-jdbc 同步 mysql 准实时数据至 ElasticSearch 搜索引擎
- 总结一些,我在书写 CSS 的时候,经常犯的错误!
- 通俗理解 set,dict 背后的哈希表
- K8S 生态周报| Google 选择 Cilium 作为 GKE 下一代数据面
- [Introduction]万字手撕Go http源码server.go
- Python 3.9 值得关注的更新点
- 趣味算法:JS实现红绳算法(匹配合适的另一半)
- 2019夏令营笔试编程题
- redis学习(四)
- 使用 Yaml 进行 selenium 的 po 设计
- 几道暑期实习笔试题