JAVA位运算符教案
Java:二进制(原码、反码、补码)与位运算

Java:⼆进制(原码、反码、补码)与位运算⼀、⼆进制(原码、反码、补码)⼆进制的最⾼位是符号位(“0”代表正数,“1”代表负数);Java中没有⽆符号数;计算机以整数的补码进⾏运算;1. 原码:将⼀个整数转换成⼆进制表⽰以 int 类型为例,int类型占4个字节、共32位。
例如,2 的原码为:00000000 00000000 00000000 00000010-2的原码为:10000000 00000000 00000000 000000102. 反码正数的反码:与原码相同负数的反码:原码的符号位不变,其他位取反例如,-2 的反码为:11111111 11111111 11111111 111111013. 补码正数的补码:与原码相同负数的补码:反码+1例如,-2 的补码为:01111111 11111111 11111111 11111110⼆、位运算Java中有4个位运算符:1. 按位与 &:两位都为1,结果为1 例如,2&3 = 2 2 的原码为: 00000000 00000000 00000000 00000010 3 的原码为: 00000000 00000000 00000000 00000011 2&3 原码为: 00000000 00000000 00000000 00000010 = 22. 按位或 |:⾄少⼀位为1,结果为1 例如,2|3 = 3 2 的原码为: 00000000 00000000 00000000 00000010 3 的原码为: 00000000 00000000 00000000 00000011 2|3 原码为: 00000000 00000000 00000000 00000011 = 33. 按位异或 ^:两位⼀个为1、⼀个为0,结果为1 例如,2|3 = 3 2 的原码为: 00000000 00000000 00000000 00000010 3 的原码为: 00000000 00000000 00000000 00000011 2^3 原码为: 00000000 00000000 00000000 00000001 = 14. 按位取反~:0变成1、1变成0 例如,~2 = -3 对2的原码取反:11111111 11111111 11111111 11111101 (取反后结果的补码,也就是-3的补码。
java位运算使用方法

java位运算使⽤⽅法
java位运算使⽤⽅法
本⽂讲解Java位运算符&,|,^,~,<<,>>,>>>
以下例⼦的初始A/B/C值为:
A 0000 0011
B 0110 1110
C 1111 1011
位运算符名称位运算符使⽤⽅式解释举例说明
与&A&B每⼀位分别计算:A与B同为1结果为1,有⼀个0则为0A&B=00000010或|A|B每⼀位分别计算:A与B同为0结果为0,有⼀个为1则为1A&B=01101111异或^A^B每⼀位分别计算:A与B不同,则为1,相同则为0A&B=01101101⾮~~A对A每⼀位取反A=11111100
左移<<B<<2B左移2位,左边超过⼋位的舍去,右边补0B=10111000
右移(场景1)>>B>>2场景1:B为正数,B右移2位,右边超过部分舍去,左边补上0B=00011011
右移(场景2)>>C>>2场景2:C为负数,C右移2位,右边超过部分舍去,左边补上1C=11111110
⽆符号右移>>>B>>>2B右移2位,右边超过部分舍去,右边超出部分补0B=00011011。
java位运算符基础入门

1 运算符/*java中的八种基本数据类型:整数:byte 、 short 、 int 、 long小数:float double字符:char布尔:boolean字符串的类型: String(引用数据类型)声明变量的方式:方式1:数据类型变量名 = 数据;方式2:数据类型变量名1 ,变量名2 ......;class Demo1 {public static void main(String[] args) {String str = ""; //字符串还是字符呢? ""字符串没有内容是属于一个空字符串。
System.out.println(str);}}/*数据类型转换:小数据类型-------->大数据类型自动类型转换大数据类型--------->小数据类型强制类型转换强制类型转换的格式:小数据类型变量名 = (小数据类型)大数据类型数据类型转换要注意的细节:1. 凡是byte、short 、 char数据类型数据在运算的时候都会自动转换成int类型的数据再运算。
2. 两个不同数据类型的数据在运算的时候,结果取决于大的数据类型。
*/class Demo2{public static void main(String[] args){/*byte b= 11; // 一个字节一两碗short s = b; // 把b变量存储的值赋予给s变量。
2字节二两的碗int i = s; // i是4字节long l = i; // l 是8个字节。
System.out.println(l);int i = 128; //4个字节byte b =(byte) i; // 1个字节System.out.println(b); // -128//如果是负数,那么最高位肯定是1,正数的二进制位的最高位是0。
System.out.println(Integer.toBinaryString(-7)); //sun给我们提供一个功能 Integer.tobinaryString() 查看一个数据的二进制数据形式的。
java程序设计教案第3讲—运算符与表达

任务一:掌握运算符及优先级任务二:阅读如下程序//program1public class Eval { // 创建类public static void main(String[] args) { // 主方法int a, b, c; // 声明int行变量a,b,ca = 15; // 将15赋值给变量ac = b = a + 4; // 将a与4的和赋值给变量b,然后再赋值给变量cSystem.out.println("c值为:" + c); // 将变量c的值输出System.out.println("b值为:" + b); // 将变量b的值输出}}//program2public class Eval { // 创建类public static void main(String[] args) { // 主方法int a, b, c; // 声明int行变量a,b,ca = 15; // 将15赋值给变量ac = b = a + 4; // 将a与4的和赋值给变量b,然后再赋值给变量cSystem.out.println("c值为:" + c); // 将变量c的值输出System.out.println("b值为:" + b); // 将变量b的值输出}}//program3public class Compare { // 创建类public static void main(String[] args) {int number1 = 4; // 声明int型变量number1int number2 = 5; // 声明int型变量number2System.out.println("number1>number的返回值为:" +(number1 > number2));/* 依次将变量number1与变量number2的比较结果输出*/System.out.println("number1<number2的返回值为:"+(number1 < number2));System.out.println("number1==number2返回值为:"+(number1== number2));System.out.println("number1!=number2返回值为:"+(number1 != number2));System.out.println("number1>= number2返回值为:"+(number1 >= number2));System.out.println("number1<=number2返回值为:"+(number1 <= number2));}}//program4public class Calculation { // 创建类public static void main(String[] args) {int a = 2; // 声明int型变量aint b = 5; // 声明int型变量b// 声明布尔型变量,用于保存应用逻辑运算符“&&”后的返回值boolean result = ((a > b) && (a != b));// 声明布尔型变量,用于保存应用逻辑运算符“||”后的返回值boolean result2 = ((a > b) || (a != b));System.out.println(result); // 将变量result输出System.out.println(result2); // 将变量result2输出}}任务三:练习:补充程序://program4public class Calculation { // 创建类public static void main(String[] args) {int a = 2; // 声明int型变量aint b = 5; // 声明int型变量b// 声明布尔型变量,用于保存应用逻辑运算符“&&”后的返回值boolean result = ((a > b) && (a != b));// 声明布尔型变量,用于保存应用逻辑运算符“||”后的返回值boolean result2 = ((a > b) || (a != b));result3=a>b?a:b;//结果为两数的最大值;System.out.println(result); // 将变量result输出System.out.println(result2); // 将变量result2输出}}任务四:掌握流程控制语句if条件语句的格式和使用if条件格式一:if (逻辑表达式) {//逻辑表达式为true时要执行的语句;}if条件格式二:if (逻辑表达式) {//逻辑表达式为true时要执行的语句;}else {//逻辑表达式为false时要执行的语句;}if条件格式三:if (逻辑表达式1) {//逻辑表达式1为true时要执行的语句;}else if (逻辑表达式2) {//逻辑表达式1为false,但逻辑表达式2为true时要执行的语句;}…else {//前面的逻辑表达式全为false时要执行的语句;}注意:if关键字之后的逻辑表达式必须得到一个逻辑值,不能象其他语言那样以数值来代替。
java的位运算符详解实例

与(&)、非(~)、或(|)、异或(^)位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。
从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。
下面详细介绍每个位运算符。
1.与运算符与运算符用符号“&”表示,其使用规律如下:两个操作数中位都为1,结果才为1,否则结果为0,例如下面的程序段。
public class data13{public static void main(String[] args){int a=129;int b=128;System.out.println("a 和b 与的结果是:"+(a&b));}}运行结果a 和b 与的结果是:128下面分析这个程序:“a”的值是129,转换成二进制就是10000001,而“b”的值是128,转换成二进制就是10000000。
根据与运算符的运算规律,只有两个位都是1,结果才是1,可以知道结果就是10000000,即128。
2.或运算符或运算符用符号“|”表示,其运算规律如下:两个位只要有一个为1,那么结果就是1,否则就为0,下面看一个简单的例子。
public class data14{public static void main(String[] args){int a=129;int b=128;System.out.println("a 和b 或的结果是:"+(a|b));}}运行结果a 和b 或的结果是:129下面分析这个程序段:a 的值是129,转换成二进制就是10000001,而b 的值是128,转换成二进制就是10000000,根据或运算符的运算规律,只有两个位有一个是1,结果才是1,可以知道结果就是10000001,即129。
3.非运算符非运算符用符号“~”表示,其运算规律如下:如果位为0,结果是1,如果位为1,结果是0,下面看一个简单例子。
java中的位运算符和运算符优先级

java中的位运算符和运算符优先级1 位运算符一共3个移位运算符,左移位<<,右移位>>和无符号移位>>>。
左移位<<在低位处补0。
右移位>>若值为正则在高位插入0,若值为负则在高位插入1。
无符号右移位>>>无论正负都在高位处插入0。
非运算符~ &(与运算)对1 位运算符一共3个移位运算符,左移位<<,右移位>>和无符号移位>>>。
左移位<<在低位处补0。
右移位>>若值为正则在高位插入0,若值为负则在高位插入1。
无符号右移位>>>无论正负都在高位处插入0。
非运算符~&(与运算)对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0。
^(异或运算先做或运算再做运算)对两个整型操作数中对应位执行布尔代数,两个位相等0,不等1。
|(或运算)对两个整型操作数中对应位执行布尔代数,两个位都为0时输出0,否则1。
如:以下哪种运算正确:A. 1010 0000 0000 0000 0000 0000 0000 0000 >> 4gives 0000 1010 0000 0000 0000 0000 0000 0000B. 1010 0000 0000 0000 0000 0000 0000 0000 >> 4gives 1111 1010 0000 0000 0000 0000 0000 0000C. 1010 0000 0000 0000 0000 0000 0000 0000 >>> 4gives 0000 1010 0000 0000 0000 0000 0000 0000D. 1010 0000 0000 0000 0000 0000 0000 0000 >>> 4gives 1111 1010 0000 0000 0000 0000 0000 0000选:B C以下哪一运算正确:A. 0000 0100 0000 0000 0000 0000 0000 0000 << 5gives 1000 0000 0000 0000 0000 0000 0000 0000B. 0000 0100 0000 0000 0000 0000 0000 0000 << 5gives 1111 1100 0000 0000 0000 0000 0000 0000C. 1100 0000 0000 0000 0000 0000 0000 0000 >> 5gives 1111 1110 0000 0000 0000 0000 0000 0000D. 1100 0000 0000 0000 0000 0000 0000 0000 >> 5gives 0000 0110 0000 0000 0000 0000 0000 0000选:A CGiven:1.Public class test (2. Public static void main (String args[]) (3. System.out.printIn (6 ^ 3);4. )5.)What is the outputAns: 52 位运算符返回的是数值,不是boolean类型值如:if(5&7>0 && 5|2)System.out.println("true");显示:编译出错3 对于一个整型数进行移位,其右操作数应该小于32,对于一个长整型数进行移位,其右操作数应该小于64。
java位运算符详解
java位运算符详解java 位运算符⼀、概述Java 定义的位运算(bitwise operators)直接对整数类型的位进⾏操作,这些整数类型包括 long,int,short,char 和 byte。
位运算符主要⽤来对操作数⼆进制的位进⾏运算。
按位运算表⽰按每个⼆进制位(bit)进⾏计算,其操作数和运算结果都是整型值。
Java 语⾔中的位运算符分为位逻辑运算符和位移运算符两类,下⾯详细介绍每类包含的运算符。
⼆、位逻辑运算符位逻辑运算符包含 4 个:&(与)、|(或)、~(⾮)和 ^(异或)。
除了 ~(即位取反)为单⽬运算符外,其余都为双⽬运算符。
表 1 中列出了它们的基本⽤法。
运算符含义实例结果&按位进⾏与运算(AND) 4 & 54|按位进⾏或运算(OR) 4 | 55^按位进⾏异或运算(XOR)4 ^ 51~按位进⾏取反运算(NOT)~ 4-52.1 位与运算符: &运算规则:参与运算的数字,低位对齐,⾼位不⾜的补零,如果对应的⼆进制位同时为 1,那么计算结果才为 1,否则为 0。
因此,任何数与 0 进⾏按位与运算,其结果都为 0。
以 100 & 0 为例:System.out.print("位与运算: " + "整型");System.out.println( 0&100);System.out.println("整型转为⼆进制:" + Integer.toBinaryString(0&100) );运⾏结果:位与运算:整型:0整型转为⼆进制:02.2 位或运算符: |运算规则:参与运算的数字,低位对齐,⾼位不⾜的补零。
如果对应的⼆进制位只要有⼀个为 1,那么结果就为 1;如果对应的⼆进制位都为 0,结果才为 0。
下⾯以11 | 7 为例:System.out.print("位或运算: " + "整型");System.out.println( 11|7 );System.out.println("整型转为⼆进制:" + Integer.toBinaryString(11|7) );运⾏结果:位或运算:整型:15整型转为⼆进制:11112.3 位异或运算符: ^运算规则:参与运算的数字,低位对齐,⾼位不⾜的补零,如果对应的⼆进制位相同(同时为 0 或同时为 1)时,结果为 0;如果对应的⼆进制位不相同,结果则为 1。
黑马程序员Java教程:位运算符
位运算符P.S.位运算是直接对二进制位进行运算。
与运算例子:6 & 3 = 2110& 011-------010示例:1.class OperatorDemo2.{3. public static void main(String[] args){4. System.out.println( 6 & 3 );5. }6.}运行结果:P.S.用“与运算”可以很方便提取某一二进制数的其中几位数。
例如:取17476二进制数的后四位。
0100010001000100& 0000000000001111------------------------0000000000000100或运算例子:6 | 3 = 7110| 011--------111示例:1.class OperatorDemo2.{3. public static void main(String[] args){4. System.out.println( 6 | 3 );5. }6.}运行结果:异或运算例子:6 ^ 3 = 5110^ 011-------101示例:1.class OperatorDemo2.{3. public static void main(String[] args){4. System.out.println( 6 ^ 3 );5. }6.}运行结果:P.S.一个数异或同一个数两次,结果还是这个数。
例子:6 ^ 3 ^ 3 = 66 ^ 3 = 5110^ 011-------101^ 011-------110技巧:利用异或运算可以实现对数据简单地进行加密,例如对一幅图片的所有数据异或3进行加密,那么这幅图片就无法查看了。
解密只需要再对图片的数据执行异或3操作即可。
取反运算:取反操作就是对二进制数值的每一位0变1,1变0。
示例:1.class OperatorDemo2.{3. public static void main(String[] args){4. System.out.println( ~6 );5. }6.}运算结果:左移运算例子:3 << 2 = 12 相当于3 * 2(2)= 1200000000000000000000000000000011000000000000000000000000000011003 << 3 = 24 相当于3 * 2(3)= 2400000000000000000000000000000011 00000000000000000000000000011000示例:1.class OperatorDemo2.{3. public static void main(String[] args){4. System.out.println( 3 << 2 );5. System.out.println( 3 << 3 );6. }7.}运行结果:总结:左移几位其实就是该数据乘以2的几次方。
java位运算
java位运算Java 位运算符位运算符⽤来对⼆进制位进⾏操作 ,Java中提供了如下所⽰的位运算符 :位运算符 (>>,<<,>>>,&,|,^,~ ) ,位运算符中 ,除~以外 ,其余均为⼆元运算符。
操作数只能为整型和字符型数据。
⼗进制和⼆进制互转算法⼗进制转⼆进制:⽤2辗转相除⾄结果为1将余数和最后的1从下向上倒序写就是结果例如302302/2 = 151 余0151/2 = 75 余175/2 = 37 余137/2 = 18 余118/2 = 9 余09/2 = 4 余14/2 = 2 余02/2 = 1 余0故⼆进制为100101110⼆进制转⼗进制从最后⼀位开始算,依次列为第0、1、2...位第n位的数(0或1)乘以2的n次⽅得到的结果相加就是答案例如:01101011.转⼗进制:第0位:1乘2的0次⽅=11乘2的1次⽅=20乘2的2次⽅=01乘2的3次⽅=80乘2的4次⽅=01乘2的5次⽅=321乘2的6次⽅=640乘2的7次⽅=0然后:1+2+0+8+0+32+64+0=107.⼆进制01101011=⼗进制107.o补码所有的整数类型(除了char 类型之外)都是有符号的整数。
这意味着他们既能表⽰正数,⼜能表⽰负数。
Java使⽤补码来表⽰⼆进制数 ,在补码表⽰中 ,最⾼位为符号位 ,正数的符号位为 0,负数为 1。
补码的规定如下 :对正数来说 ,最⾼位为 0,其余各位代表数值本⾝ (以⼆进制表⽰ ),如 +42的补码为 00101010。
对负数⽽⾔ ,把该数绝对值的补码按位取反 ,然后对整个数加 1,即得该数的补码。
如 -42的补码为 11010110 (00101010 按位取反 11010101 +1=11010110 )⽤补码来表⽰数 ,0的补码是唯⼀的 ,都为 00000000。
(⽽在原码 ,反码表⽰中 ,+0和 -0的表⽰是不唯⼀的 ,可参见相应的书籍)。
JAVA_位取反运算符~
JAVA_位取反运算符~
⾸先,需要了解负数的补码:负数的补码是其绝对值的补码求反再+1.
位取反运算符会将⽬标数的补码的各位取反。
~正数的流程:1. ⾸先⼗进制数会被转化为⼆进制补码的形式;
2. 然后上⼀步得到的⼆进制补码的各位取反(~发挥作⽤);
3. 上⼀步得到的⼆进制数-1,然后取反,得到⽬标值(这个⽬标值是指~正数这个负数)的绝对值的补码;
4. 上⼀步的补码转化为⼗进制正数,然后+负号,就得到了⽬标值。
~负数的流程: 1. ⾸先将负数的绝对值转化为⼆进制补码的形式;
2. 将上⼀步得到的⼆进制补码的各位取反再+1,得到负数的⼆进制补码;
3. 将上⼀步得到的负数的⼆进制补码的各位取反(~发挥作⽤);
4. 上⼀步得到的⼆进制序列转化为⼗进制就是⽬标值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JAVA位运算符
之前讲完了算术运算符、赋值运算符、比较运算符和逻辑运算符,今天学习位运算符。
一、概念
位运算符,所谓的位,是二进制的位,也就是说这个是用来二进制运算的运算符号。
二、这个运算符有哪些?(PPT)
基本介绍一下再挨个看(在记事本中演示)。
演示:
1、左移右移:(板书)
左移:3<<2;(3左移2位)
这个运算要怎么完成?看着都很别扭刚才说位运算符号是关于什么的运算二进制所以应该先得有二进制计算机底层会先把3变成二进制给大家画一下是怎么样的(板书)
先写3的二进制:0000-0000 0000-0000 0000-0000 0000-0011(因为整数占4个8位)那么往左移两位是什么意思?给大家画一根竖线
这个数字变成了8421法成12了那么3<<2=?12
这就叫位运算先不管什么时候用以后都会讲
右移:6>>2;(6右移2位)
2位0 这样右移以后6就变成了1
那么,(6>>1)6右移1位是几?学生计算 3
发现了什么规律?一个数往左移越移越大,往右移越移越小,右移移多了有效位就越越光了,全剩0了,那么他的移动方式就是按照2的倍数在变化。
你们自己套一下。
3<<1=6;3<<2=12;是不是按照2的倍数在变化。
3<<3=24;
左移规律:一个数乘以2的移动的位数
这么说有点抽象给你们写一下3<<2=12 是不是3*22=12
3<<1=6 3*21=6
3<<3=24 3*23=24
所以往左移就是那个数乘以2的移动的位数次幂
右移规律:是不是除以2的移动位数的几次幂
也写一下6>>1=3 6/21=3
6>>2=1 6/22=1 (6是整数4也是整数得出来的也是整数) 总结一下:(板书)<<:乘以2的移动位数次幂
>>:除以2的移动位数次幂
学这个干嘛?最快的运算是位运算像乘除这种运算用位运算是最快的但是他有局限性都是以2的倍数增长
2、无符号右移
有没有发现如果进行右移高位会空出来空出来时注意两个大于号有个特点当我们右移时高位要补什么要按原有最高位定给大家举个例子-6的2进制形式上次我们讲了就是正6的2进制取反加1 我上次说了最短你也得写8位现在我们学了数据类型知道上次我们讲的1个8位是什么类型byte 那么我们今天学了数据类型我们知道-6没有标志是什么类型的那么就默认是整数类型来进行运算那么byte型的-6是怎么表示的
那么这个情况下我将它右移两位那么空出来的补什么就要看他的最高位是什么最高位是1就补1 最高位是0就补0 这个就是带符号右移最高位为1就是负数因为
这
个结果还是负数
如果你要是用0还是1 都用0来补这个后面会有应用
总结:>>:最高位补什么由原有最高位值来定,最高位是什么补什么。
>>>:无论最高位是什么,都用0来补。
回到PPT还有与或异或还有反码与符号也可作为位运算存在。