Java编程(位运算符)

二进制运算符   由于计算机内部的数据都以二进制的形式存在,所以在Java语言中提供了直接操作二进制的运算符,这就是下面要讲解的位运算符和移位运算符。   使用二进制的运算符,可以直接在二进制的基础上对数字进行操作,执行的效率比一般的数学运算符高的多,该类运算符大量适用于网络编程、硬件编程等领域。   二进制运算符在数学上的意义比较有限。   在Java代码中,直接书写和输出的数值默认是十进制,Java代码中无法直接书写二进制数值,但是可以书写八进制和十六进制数字,八进制以数字0开头,例如016,十六进制以数字0和x开头,例如0x12,0xaf等等。   在计算二进制运算时,Java语言的执行环境(JRE)首先将十进制的数字转换为二进制,然后进行运算。如果输出结果的值,则数字会被转换成十六进制进行输出。 需要注意的是:   1、正数的机器数是原码,负数的机器数是补码,计算时需要小心。关于二进制和补码的计算可以参看《Java编程那些事儿7——进制的概念》和《Java编程那些事儿8——计算机内部的数据表达》。   2、整数型的计算结果都是int型,而不管是对byte还是short进行二进制运算。 位运算符   Java语言中的位运算符主要有4种:&(位与)、|(位或)、^(异或)和~(按位取反),下面依次介绍运算规则和使用示例。   l &(AND)   运算规则:参与运算的数字,低位对齐,高位不足的补零,对应的二进制位都为1,则运算结果为1,否则为0.适用场合:屏蔽数字中某一位或某些位。因为任何数和0与都是0.示例代码:   int a = 4;   int b = 10;   int c = a & b;   计算过程:   4的二进制形式为0000 0000 0000 0000 0000 0000 0000 0100   10的二进制形式为0000 0000 0000 0000 0000 0000 0000 1010   按照计算规则,结果为0000 0000 0000 0000 0000 0000 0000 0000   这个数字转换为十进制就是数字0 l | (OR)   运算规则:参与运算的数字,低位对齐,高位不足的补零,对应的二进制位有一个为1则为1,否则为0.适用场合:将数字中某一位或某些位修改成1.因为1和任何数或都是1.示例代码:   int a = 4;   int b = -10;   int c = a | b;   计算过程:   4的二进制形式为0000 0000 0000 0000 0000 0000 0000 0100   10的二进制形式为1111 1111 1111 1111 1111 1111 1111 0110   Examda提示: 按照计算规则,结果为1111 1111 1111 1111 1111 1111 1111 0110   这个二进制数转换为十进制就是数字-10. l ^(XOR)   运算规则:参与运算的数字,低位对齐,高位不足的补零,对应的二进制位相同为零,不相同为1.适用场合:判断数字对应的位是否相同。   示例代码:   int a = 4;   int b = 10;   int c = a ^ b;   计算过程:   4的二进制形式为0000 0000 0000 0000 0000 0000 0000 0100   10的二进制形式为0000 0000 0000 0000 0000 0000 0000 1010   按照计算规则,结果为0000 0000 0000 0000 0000 0000 0000 1110   这个数字转换为十进制就是数字14 l ~(NOT)   运算规则:只操作一个数字,将该数字中为1的位变成0,为0的位变成1.适用场合:反转数字的内容示例代码:   int a = 4;   int c = ~a;   计算过程:   4的二进制形式为0000 0000 0000 0000 0000 0000 0000 0100   按照计算规则,结果为1111 1111 1111 1111 1111 1111 1111 1011   这个数字转换为十进制就是数字-5.其实位运算和实际的应该实现保持一致,也就是提供的电路级运算符号,每种运算符都有对应的电路实现。   实际使用简单示例:   把任意数字转换为正数   假设n是一个任意的整数,则把n转换为正数的代码为:   int m = n & 0x7fffffff;   判断任意数字倒数第三位的值是否为1假设n是一个任意的整数,则判断的代码为:   int m = n & 0x4;   boolean b = (m != 0);   将任意数字倒数第四位置为   假设n是一个任意的整数,则代码为:   int m = n | 0x8;

在Thinking   in   Java第三章中的一段话: 移位运算符面向的运算对象也是二进制的“位”。可单独用它们处理整数类型(主类型的一种)。左移位运算符( < <)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。“有符号”右移位运算符(> > )则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。Java也添加了一种“无符号”右移位运算符(> > > ),它使用了“零扩展”:无论正负,都在高位插入0。这一运算符是C或C++没有的。 若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只有右侧的5个低位才会用到。这样可防止我们在一个int数里移动不切实际的位数。若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。但在进行“无符号”右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果(Java   1.0和Java   1.1特别突出)。它们会自动转换成int类型,并进行右移位。但“零扩展”不会发生,所以在那些情况下会得到-1的结果。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

04-01.总结switch,for,while,do。while跳转语句

1:switch语句(掌握) (1)格式: switch(表达式) { case 值1: 语句体1; break; case 值2: 语句体2; ...

3795
来自专栏zingpLiu

面向对象(一)【“类与对象”的概念及特性】

面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的程序编程范式,同时也是一种程序开发的抽象方针。在...

1232
来自专栏前端说吧

JS-原生代码或方法实现特定效果总结(更新中...)

3636
来自专栏C语言及其他语言

【蓝桥杯系列】第一节 C的基本用法

置顶编程范收获更多热门编程快讯 大家好,最近很多小伙伴向我反应小编!我参加了蓝桥杯但是我连那是什么都不知道,我该怎么训练?是不是在网站刷题就可以啊? 在这里我要...

3887
来自专栏老九学堂

嘀 , 嘀嘀 ... 常用排序算法再总结

  这篇文章中再和小伙伴们来探讨一下常用的非比较排序算法:计数排序,基数排序,桶排序。在一定条件下,它们的时间复杂度可以达到O(n)。

1233
来自专栏Java 源码分析

八大排序算法

​ 八大排序算法是面试经常考到的,尤其是快排,希尔排序和归并也是经常会让写代码的题目,其实只要用一句话说明了他们的原理我们写起代码就没那么困难。 冒泡排序...

4863
来自专栏QQ音乐前端团队专栏

理解浮点数

相信大家在平常的 JavaScript 开发中,都有遇到过浮点数运算精度误差的问题。

6094
来自专栏深度学习自然语言处理

【珍藏版】长文详解python正则表达式

想要使用python的正则表达式功能就需要调用re模块,re模块为高级字符串处理提供了正则表达式工具。模块中提供了不少有用的函数,比如:compile函数、ma...

692
来自专栏技术沉淀

Python: collections模块实例透析Collections模块

1878
来自专栏贺贺的前端工程师之路

字面量,常量和变量之间的区别?

经常看到这三者,基本每天作为一个程序媛的我,都和这三者在打着交道。之前每个都会使用,但是这样的来区别三者之间的关系还是第一次。从定义到实际例子,这次全面搞清楚,...

841

扫码关注云+社区

领取腾讯云代金券