位操作符

操作符cjava说明
按位与a & ba & b相同位的两个数字都为1,则为1;若有一个不为1,则为0。
按位或a | ba | b相同位只要一个为1即为1。
按位异或a ^ ba ^ b相同位不同则为1,相同则为0。(可用于简单加密。^运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a ^b) ^ b = a。^运算可以用于简单的加密,比如我想对我MM说1314520,但怕别人知道,于是双方约定拿我的生日19880516作为密钥。1314520 ^ 19880516 = 20665500,我就把20665500告诉MM。MM再次计算20665500 ^ 19880516的值,得到1314520,于是她就明白了我的企图。)
按位取反~a~a~按位取反。5二进制00000101,取反11111010,代表-6
左移a << ba << b
带符号右移a >> ba >> b
无符号右移a>>> b

左移操作(<<)
规则:
右边空出的位用0填补
高位左移溢出则舍弃该高位。
计算机中常用补码表示数据:
数据 127,补码和原码一样:0111 1111。
左移一位: 1111 1110 -> 这个补码对应的原码为:1000 0010 对应十进制:-2
左移二位: 1111 1100 -> 这个补码对应的原码为:1000 0100 对应十进制:-4
左移三位: 1111 1000 -> 这个补码对应的原码为:1000 1000 对应十进制:-8
左移四位: 1111 0000 -> 这个补码对应的原码为:1001 0000 对应十进制:-16
左移五位: 1110 0000 -> 这个补码对应的原码为:1010 0000 对应十进制:-32
左移六位: 1100 0000 -> 这个补码对应的原码为:1100 0000 对应十进制:-64
左移七位: 1000 0000 -> 这个补码对应的原码为:1000 0000 对应十进制:-128
左移八位: 0000 0000 -> 这个补码对应的原码为:0000 0000 对应十进制:0

注:

原码到补码的计算方式:取反+1,
补码到原码的计算方式:-1再取反。
数据-1,它的原码为1000 0001,补码为1111 1111
左移一位: 1111 1110 -> 这个补码对应的原码为:1000 0010 对应十进制:-2
左移二位: 1111 1100 -> 这个补码对应的原码为:1000 0100 对应十进制:-4
左移三位: 1111 1000 -> 这个补码对应的原码为:1000 1000 对应十进制:-8
左移四位: 1111 0000 -> 这个补码对应的原码为:1001 0000 对应十进制:-16
左移五位: 1110 0000 -> 这个补码对应的原码为:1010 0000 对应十进制:-32
左移六位: 1100 0000 -> 这个补码对应的原码为:1100 0000 对应十进制:-64
左移七位: 1000 0000 -> 这个补码对应的原码为:1000 0000 对应十进制:-128
左移八位: 0000 0000 -> 这个补码对应的原码为:0000 0000 对应十进制:0
可以看出127和-1的结果完全一样。移位操作与正负数无关,它只是忠实的将所有位进行移动,补0,舍弃操作。
右移操作(>>)
规则:
左边空出的位用0或者1填补。正数用0填补,负数用1填补。注:不同的环境填补方式可能不同;

低位右移溢出则舍弃该位。

1、127的补码:0111 1111

右移一位: 0011 1111 -> 原码同补码一样 对应十进制:63

右移二位: 0001 1111 -> 原码同补码一样 对应十进制:31

右移三位: 0000 1111 -> 原码同补码一样 对应十进制:15

右移四位: 0000 0111 -> 原码同补码一样 对应十进制:7

右移五位: 0000 0011 -> 原码同补码一样 对应十进制:3

右移六位: 0000 0001 -> 原码同补码一样 对应十进制:1

右移七位: 0000 0000 -> 原码同补码一样 对应十进制:0

右移八位: 0000 0000 -> 原码同补码一样 对应十进制:0

2、-128的补码:1000 0000

右移一位: 1100 0000 -> 这个补码对应的原码为:1100 0000 对应十进制:-64

右移二位: 1110 0000 -> 这个补码对应的原码为:1010 0000 对应十进制:-32

右移三位: 1111 0000 -> 这个补码对应的原码为:1001 0000 对应十进制:-16

右移四位: 1111 1000 -> 这个补码对应的原码为:1000 1000 对应十进制:-8

右移五位: 1111 1100 -> 这个补码对应的原码为:1000 0100 对应十进制:-4

右移六位: 1111 1110 -> 这个补码对应的原码为:1000 0010 对应十进制:-2

右移七位: 1111 1111 -> 这个补码对应的原码为:1000 0001 对应十进制:-1

右移八位: 1111 1111 -> 这个补码对应的原码为:1000 0001 对应十进制:-1

常见应用
左移相当于*2,只是要注意边界问题。如char a = 65; a<<1 按照*2来算为130;但有符号char的取值范围-128~127,已经越界,多超出了3个数值,所以从-128算起的第三个数值-126才是a<<1的正确结果。
而右移相当于除以2,只是要注意移位比较多的时候结果会趋近去一个非常小的数,如上面结果中的-1,0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值