一、位操作符

位操作符在实际工作中用的并不常见,但是我比较纠结这些位操作。所以实际练习位操作符的每一个操作符的操作实例来理解其具体含义。

建议: 如果确实感兴趣,就看看,个人建议跳过这个章节。 真正工作用到了,再来看。

二、一个整数的二进制表达

位操作都是对二进制而言的,但是我们平常使用的都是十进制比如5。

而5的二进制是101。

所以在开始学习之前,需要掌握一个整数的二进制表达是多少。

通过Integer.toBinaryString() 方法,将一个十进制整数转换为一个二进制字符串

public class HelloWorld {

public static
void main(String[] args) {

int i = 5;

String b = (Integer.toBinaryString(i)); // 5的二进制的表达101

System.out.println(i+" 的二进制表达是: "+b);

}

}

三、位或

5的二进制是101

6的二进制是110

所以 5|6 对每一位进行或运算,得到 111->7

详解:

1 0 1

1 1 0

进行或运算,任意一位是1,则该位变为1

所以对

1 0 1

1 1 0

进行或运算的结果是

1 1 1

111的十进制数为7

public class HelloWorld {

public static
void main(String[] args) {

int i  =5;

int j = 6;

System.out.println(Integer.toBinaryString(i)); //5的二进制是101

System.out.println(Integer.toBinaryString(j)); //6的二进制是110

System.out.println(i|j); //所以 5|6 对每一位进行或运算,得到 111->7

}

}

四、位与

5的二进制是101

6的二进制是110

所以 5&6 对每一位进行与运算,得到 100->4

详解:

1 0 1

1 1 0

进行与运算,任意一位是0,则该位变为0

所以对

1 0 1

1 1 0

进行与运算的结果是

1 0 0

100的十进制数为4

public class HelloWorld {

public static
void main(String[] args) {

int i  =5;

int j = 6;

System.out.println(Integer.toBinaryString(i)); //5的二进制是101

System.out.println(Integer.toBinaryString(j)); //6的二进制是110

System.out.println(i&j); //所以 5&6 对每一位进行与运算,得到 100->4

}

}

五、异或

5的二进制是101

6的二进制是110

所以 5^6 对每一位进行异或运算,得到 011->3

一些特别情况:

任何数和自己进行异或 都等于 0

任何数和0 进行异或 都等于自己

public class HelloWorld {

public static
void main(String[] args) {

int i  =5;

int j = 6;

System.out.println(Integer.toBinaryString(i)); //5的二进制是 101

System.out.println(Integer.toBinaryString(j)); //6的二进制是110

System.out.println(i^j); //所以 5^6 对每一位进行或运算,得到 011->3

System.out.println(i^0);

System.out.println(i^i);

}

}

六、取非

5 的二进制是 00000101

所以取反即为 11111010

这个二进制换算成十进制即为-6

public class HelloWorld {

public static
void main(String[] args) {

byte i  =5;

System.out.println(Integer.toBinaryString(i)); //5的二进制是00000101,所以取非即为11111010,即为-6

System.out.println(~i);

}

}

七、左移、右移

左移:根据一个整数的二进制表达,将其每一位都向左移动,最右边一位补0

右移:根据一个整数的二进制表达,将其每一位都向右移动

public class HelloWorld {

public static
void main(String[] args) {

byte i  =6;

//6的二进制是110

System.out.println(Integer.toBinaryString(i));

//6向左移1位后,变成1100,对应的10进制是12

System.out.println(i<<1);

//6向右移1位后,变成11,对应的10进制是3

System.out.println(i>>1);

}

}

八、练习--快速计算2*16

不用乘法符号(*) 计算 2x16

官方答案:

使用 2 * 16的方式相对于 2<<4 位移会更慢一点, 2<<4位移的方式是最快的

public class HelloWorld {

public static
void main(String[] args) {

int i = 2;

int j = 2*16; //使用乘法

System.out.println("j=2*16:\t"+j);

int k = 2<<4;

System.out.println("k=2<<4:\t"+k);

}

}

九、带符号右移与无符号右移

带符号右移 >>

对于正数, 带符号右移 >> 会把所有的位右移,并在最前面补0

对于负数, 带符号右移 >> 会把所有的位右移,并在最前面补1

无符号右移>>>

如果是一个负数,那么对应的二进制的第一位是1

无符号右移>>>会把第一位的1也向右移动,导致移动后,第一位变成0

这样就会使得负数在无符号右移后,得到一个正数

简单的说:

带符号右移 >> 移动后正的还是正的,负的还是负的,符号不变

无符号右移>>>移动后,变正的了

public class HelloWorld {

public static
void main(String[] args) {

int i  =-10;

//-10的二进制是11111111111111111111111111110110

//第一位是1,即符号位,代表这是一个负数

System.out.println(Integer.toBinaryString(i));

//对于正数, 带符号右移 >> 会把所有的位右移,并在最前面补0

//对于负数, 带符号右移 >> 会把所有的位右移,并在最前面补1

//-10带符号右移1位,移动后前面补齐1

//得到11111111111111111111111111111011

//因为第一位是1,所以依然是一个负数,对应的十进制是-5

int j = i>>1;

System.out.println(Integer.toBinaryString(j));

System.out.println(j);

//-10无符号向右移1位,符号位也会向右移,第一位就变成了0

//得到01111111111111111111111111111011,对应的十进制是2147483643

int k = i>>>1;

System.out.println(Integer.toBinaryString(k));

System.out.println(k);

}

}

十、练习--位操作符

题目:

int i = 3; // 二进制是11

int j = 2; // 二进制是10

int c = ((i | j) ^ (i & j)) << 2 >>> 1;

心算答案,不要一来就放在eclipse中计算结果

官方答案:

public class HelloWorld {

public static void main(String[] args) {

int i = 3; // 二进制是11

int j = 2; // 二进制是10

int c = ((i | j) ^ (i & j)) << 2 >>> 1;

//          11

//                    10

//               01

//                            0100

//                                  010

//010=2

}

}

Java知识系统回顾整理01基础04操作符04位操作符的更多相关文章

  1. Java知识系统回顾整理01基础03变量04类型转换

    一.不同类型之间的数据可以互相转换,但是要满足一定的规则 二.数据类型转换规则 转换规则如图所示  精度高的数据类型就像容量大的杯子,可以放更大的数据 精度低的数据类型就像容量小的杯子,只能放更小的数 ...

  2. Java知识系统回顾整理01基础06数组04增强型for循环

    增强型for循环在遍历一个数组的时候会更加快捷 一.增强型for循环 注:增强型for循环只能用来取值,却不能用来修改数组里的值 public class HelloWorld { public st ...

  3. Java知识系统回顾整理01基础04操作符01算术操作符

    一.算数操作符类别 基本的有: + - * / % 自增 自减: ++ -- 二.基本算数操作符 + - * / 基本的加 减 乘 除 public class HelloWorld { public ...

  4. Java知识系统回顾整理01基础04操作符06三元运算符

    一.三元运算符 表达式?值1:值2 如果表达式为真 返回值1 如果表达式为假 返回值2 if语句学习链接:if语句 public class HelloWorld { public static vo ...

  5. Java知识系统回顾整理01基础04操作符02关系操作符

    一.关系操作符 关系操作符:比较两个变量之间的关系  > 大于 >= 大于或等于 < 小于 <= 小于或等于 == 是否相等 != 是否不等 public class Hell ...

  6. Java知识系统回顾整理01基础01第一个程序04创建Eclipse项目

    一.为Eclipse设置桌面快捷方式图标 二.双击桌面快捷方式打开Eclipse 三.选择工作区 使用在命令行Hello World中的项目目录e:\project 除了第一次启动eclipse的时候 ...

  7. Java知识系统回顾整理01基础05控制流程04 for

    一.for 比较for和while public class HelloWorld { public static void main(String[] args) { //使用while打印0到4 ...

  8. Java知识系统回顾整理01基础04操作符07Scanner

    一.Scanner 需要用到从控制台输入数据时,使用Scanner类. 二.使用Scanner读取整数 注意: 使用Scanner类,需要在最前面加上 import java.util.Scanner ...

  9. Java知识系统回顾整理01基础04操作符05赋值操作符

    一.赋值操作 赋值操作的操作顺序是从右到左 int i = 5+5; 首先进行5+5的运算,得到结果10,然后把10这个值,赋给i public class HelloWorld { public s ...

随机推荐

  1. oeasy教您玩转linux010103我在那pwd

    我在哪pwd 回忆上次内容 我们上次列出了关于发行版详细信息文件的位置 ls /etc/*release 其中 ls是命令的名字,意味着list列表 /是整个文件系统的根root /etc是根目录下的 ...

  2. MockMvc编写单测

    目录 MockMvc 注意点 code 待测试的controller 测试类 github MockMvc 注意点 1.通过spring上下文获取mockmvc对象 @BeforeEach publi ...

  3. PHP弱类型hash比较缺陷

    成因分析: == 在进行比较的时候,会先将两边的变量类型转化成相同的,再进行比较 0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0. 因此CTF比赛中需要用到弱类型H ...

  4. day46:jQuery

    目录 1.jQuery初识 2.选择器 3.文本操作 4.class类值操作 5.css样式操作 6.值操作 7.注意点:button按钮提交form表单数据 8.jquery选择器补充 9.模态对话 ...

  5. golang 内置print/println、fmt、log的区别

    fmt.Println与fmt.Print区别 换行区别不用多说,另外一个区别在于fmt.Print只有在参数间都不是字符串时才会产生间隔 fmt与log的重要区别 fmt没有做同步处理 fmt标准输 ...

  6. H5选择器

    1.标签选择器 注意点:1. 标签选择器选中当前所有的标签,而不能单独选择某个标签 2.标签选择器不无多深都能被选中     3.只要是HTML中的标签就可以作为表亲啊选择器(h/a/img/ul/o ...

  7. Oracle SQL Developer中查看解释计划Explain Plan的两种方法

    方法一: 比如要查看解释计划的SQL是:select * from hy_emp 那么在输入窗口输入: EXPLAIN PLAN FOR select * from hy_emp 之后执行,输出窗口会 ...

  8. Ajax跨域解决方案大全

    题纲 关于跨域,有N种类型,本文只专注于ajax请求跨域(,ajax跨域只是属于浏览器"同源策略"中的一部分,其它的还有Cookie跨域iframe跨域,LocalStorage跨 ...

  9. Vue的属性、事件、插槽

    属性 自定义属性props ->组件的propos中声明的属性 原生属性attrs ->没有声明属性,默认自动挂载在组件的根元素上,inheritAttrs可以关闭自动挂载 特殊属性cla ...

  10. H5游戏定制,4大优势助力企业曝光10W+

    H5游戏定制,4大优势助力企业曝光10W+ 移动互联网已成为了人们生活的一部分,普通广告形式已很难吸引用户的眼球,企业要怎样才能将广告更广泛的传播给更多用户呢?根据TOM游戏多年从业经验,为大家分享以 ...