## Java编程那些事儿25—位运算符
郑州游戏学院 陈跃峰
出自:[http://blog.csdn.net/mailbomb](http://blog.csdn.net/mailbomb)
**4.5 二进制运算符**
由于计算机内部的数据都以二进制的形式存在,所以在Java语言中提供了直接操作二进制的运算符,这就是下面要讲解的位运算符和移位运算符。
使用二进制的运算符,可以直接在二进制的基础上对数字进行操作,执行的效率比一般的数学运算符高的多,该类运算符大量适用于网络编程、硬件编程等领域。
二进制运算符在数学上的意义比较有限。
在Java代码中,直接书写和输出的数值默认是十进制,Java代码中无法直接书写二进制数值,但是可以书写八进制和十六进制数字,八进制以数字0开头,例如016,十六进制以数字0和x开头,例如0x12,0xaf等等。
在计算二进制运算时,Java语言的执行环境(JRE)首先将十进制的数字转换为二进制,然后进行运算。如果输出结果的值,则数字会被转换成十六进制进行输出。
需要注意的是:
1、正数的机器数是原码,负数的机器数是补码,计算时需要小心。关于二进制和补码的计算可以参看《Java编程那些事儿7——进制的概念》和《Java编程那些事儿8——计算机内部的数据表达》。
2、整数型的计算结果都是int型,而不管是对byte还是short进行二进制运算。
**4.5.1 位运算符**
Java语言中的位运算符主要有4种:&(位与)、|(位或)、^(异或)和~(按位取反),下面依次介绍运算规则和使用示例。
1. &(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
2. | (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
按照计算规则,结果为1111 1111 1111 1111 1111 1111 1111 0110
这个二进制数转换为十进制就是数字-10。
3. ^(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
4. ~(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。
其实位运算和实际的应该实现保持一致,也就是提供的电路级运算符号,每种运算符都有对应的电路实现。
实际使用简单示例:
5. 把任意数字转换为正数
假设n是一个任意的整数,则把n转换为正数的代码为:
int m = n & 0x7fffffff;
6. 判断任意数字倒数第三位的值是否为1
假设n是一个任意的整数,则判断的代码为:
int m = n & 0x4;
boolean b = (m != 0);
7. 将任意数字倒数第四位置为1
假设n是一个任意的整数,则代码为:
int m = n | 0x8;
- 前言
- (1)序言
- (2)程序设计是什么?
- (3)你适合学习程序设计吗?
- (4)如何学好程序设计?
- (5)程序设计介绍小结
- (6)计算机软件基本概念
- (7)进制的概念
- (8)计算机内部的数据表达
- (9)网络编程基础
- (10)Java语言简介
- (11)JDK的获得、安装和配置
- (12)第一个HelloWorld程序
- (13)Eclipse基本使用
- (14)Eclipse基础使用进阶
- (15)如何学好Java语法
- (16)代码框架、关键字和标识符
- (17)基本数据类型
- (18)变量和常量
- (19)数据类型转换
- (20)空白、语句结束和注释
- (21)算术运算符
- (22)比较运算符
- (23)逻辑运算符
- (24)赋值运算符
- (25)位运算符
- (26)移位运算符
- (27)其它运算符
- (28)运算符优先级
- (29)表达式
- (30)流程控制基础
- (31)if语句语法(1)
- (32)if语句语法(2)
- (33)if语句语法(3)
- (34)switch语句语法
- (35)while语句语法
- (36)do-while语句语法
- (37)for语句语法
- (38)break和continue语句
- (39)流程控制综合示例1
- (40)流程控制综合示例2
- (41)流程控制综合示例3
- (42)流程控制综合练习
- (43)数组概述
- (44)数组基础语法
- (45)数组使用示例1
- (46)数组使用示例2
- (47)数组使用示例3
- (48)多维数组基础
- (49)多维数组使用示例1
- (50)多维数组使用示例2
- (51)多维数组练习
- (52)方法声明
- (53)方法声明示例
- (54)方法调用
- (55)方法重载和参数传递
- (56)方法练习
- (57)面向对象基础
- (58)类(一)
- (59)类(二)
- (60)对象
- (61)面向对象设计方法和面向对象特性(一)
- (62)继承(二)
- (63)多态性
- (64)访问控制符、修饰符和其它关键字
- (65)static修饰符
- (66)final修饰符
- (67)this和super
- (68)抽象类和接口(一)
- (69)抽象类和接口(二)
- (70)抽象类和接口(三)
- (71)内部类简介
- (72)包的概念
- (73)JDK文档使用
- (74)java.lang包介绍1
- (75)String类使用
- (76)StringBuffer类和System类
- (77)包装类
- (78)时间和日期处理
- (79)Random随机处理
- (80)集合框架简述
- (81)异常处理概述
- (82)异常处理语法1
- (83)异常处理语法2
- (84)IO简介
- (85)IO类体系
- (86)文件操作之File类使用
- (87)文件操作之读取文件
- (88)文件操作之写文件
- (89)读取控制台输入
- (90)装饰流使用1
- (91)装饰流使用2
- (92)IO使用注意问题
- (93)多线程基础
- (94)多线程实现方式1
- (95)多线程实现方式2
- (96)多线程使用示例1
- (97)多线程使用示例2
- (98)多线程问题及处理1
- (99)多线程问题及处理2
- (100)多线程问题及处理3
- (101)网络编程概述
- (102)网络编程技术1
- (103)网络编程技术2
- (104)网络编程技术3
- (105)网络编程技术4
- (106)网络编程技术5
- (107)网络协议概念
- (108)网络编程示例1
- (109)网络编程示例2
- (110)网络编程小结