原码,反码,补码 与(&) 或(|) 非(~) 异或(^) 左移 << 右移 >> 无符号右移 >>>

原码

数字在计算机中以二进制表示,8位的字长,最高位是符号位, 正数为0,负数为1.比如,3为0000 0011; -3为1000 0011

注意,Java中int为32位。3的16进制表示为3,-3的16进制为fffffffd.

反码

正数的反码和原码相同。

负数的反码为符合位不变,其余按位取反。

3 为0000 0011; -3为1111 1100

补码

正数的补码和原码相同。

负数的补码为反码+1.

3 为0000 0011; -3为1111 1101

与(&)

按位与,位数对齐,全部为1的结果为1.

1&2 == 0                2&3 ==  2
0000 0001               0000 0010
0000 0010               0000 0011
---------               ---------
0000 0000               0000 0010

或(|)

按位或,位数对齐,只要有一个为1,则结果为1

1|2 == 3                2|3 ==  3
0000 0001               0000 0010
0000 0010               0000 0011
---------               ---------
0000 0011               0000 0011

非(~)

按位取反。

~1 == -2

0000 0001              
---------              
1111 1110              

我们直到负数的表示为反码+1. 所以,该结果中的反码为(1111 1110 - 0000 0001)=1111 1101,则绝对值原码为0000 0010, 即2。即结果为-2.

异或(^)

相同为假,不同为真。

1^2 == 3                2^3 ==  1
0000 0001               0000 0010
0000 0010               0000 0011
---------               ---------
0000 0011               0000 0001

左移 <<

所有的位左移,低位即右侧补0.

1<<2 == 4               3<<3 == 24
0000 0001               0000 0011
0000 0100               0001 1000

左移几位则相当于10进制乘以2的多少次方。所以1<<2==1*2*2==4; 3<<<3==3*2*2*2==24

右移 >>

正数右移,高位用0补,负数右移,高位用1补.

1>>2 == 0            13>>2 ==3           -3>>2 == -1     
0000 0001            0000 1101           1111 1101
---------            ---------           ---------
0000 0000            0001 0011           1111 1111

无符号右移 >>>

正数无符号右移同右移,负数无符号右移则高位补0.

1>>>2 == 0            13>>>2 ==3           -3>>>2 == 1073741823
0000 0001            0000 1101           fffffffd
---------            ---------           ---------
0000 0000            0001 0011           3fffffff

衍生运算符

由位运算操作符衍生而来的有:

&= 按位与赋值

|=  按位或赋值

^= 按位非赋值

>>= 右移赋值

>>>= 无符号右移赋值

<<= 赋值左移

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黑泽君的专栏

java基础学习_基础语法(上)01_day02总结

=============================================================================

1083
来自专栏黑泽君的专栏

Java中数组高级之各种排序代码

801
来自专栏编程直播室

读书笔记:《算法图解》第一章 算法简介时间复杂度#

1764
来自专栏Venyo 的专栏

HttpServletRequest.getParameter()出现乱码现象解决方案

一、首先在项目中添加一个过滤器类,用来将所有参数转化为指定格式(UTF-8) import java.io.IOException;   import java...

38011
来自专栏LeetCode

LeetCode SingleNumber I,II,III

Given a non-empty array of integers, every element appears twice except for one....

1670
来自专栏王肖的UT

OpenGL Shading Language(GLSL)语法一览

5536
来自专栏书山有路勤为径

跳跃游戏1&2跳跃游戏2

LeetCode 55. Jump Game 一个数组存储了非负整型数据,数组中的第i个元素nums[i],代表了可以从数组第i 个位置最多向前跳跃nums[...

723
来自专栏指尖下的Android

Java &、&&、|、||、^、<<、>>、~、>>>等运算符

无符号右移运算符和右移运算符的主要区别在于负数的计算,因为无符号右移是高位补0,移多少位补多少个0。

3.1K1
来自专栏专注 Java 基础分享

数值信息的机器级存储

计算机中使用八位的块,或者说是「字节」,作为最小的寻址单元。你可以将整个存储器视作一个超大的「字节数组」,每个字节都有一个唯一的数字编号,这个编号就是所谓的地址...

4046
来自专栏有趣的Python

算法与数据结构(二)附录:冒泡&插入&选择&希尔排序对比

冒泡排序 冒泡排序(Bubble Sort),是一种 计算机科学领域的较简单的 排序算法。 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误...

2714

扫码关注云+社区