java编程基础(二)位运算符

位运算符

针对二进制运算,java提供了位运算符:

运算符说明
&位与
|位或
^异或
~求反
<<左移位
>>带符号右移位
>>>不带符号右移位

位运算

1. 位与 &

两个整数值的32位,每一位和每一位求与。

两位都是1与得的结果是1;只要有0结果就是0。

00000000 00000000 00000000 01101001
00000000 00000000 00000000 00100011 &
----------------------------------------
00000000 00000000 00000000 00100001

2. 位或 |

只要有1结果就是1;两位都是0结果是0。

00000000 00000000 00000000 01101001
00000000 00000000 00000000 00100011 |
----------------------------------------
00000000 00000000 00000000 01101011

3. 异或 ^

异或运算是“找不同”

不同是1;相同是0。

00000000 00000000 00000000 01101001
00000000 00000000 00000000 00100011 ^
----------------------------------------
00000000 00000000 00000000 01001010

异或还有个特点,就是对同一个值异或两次会得到原值。
试着用上面异或的结果再对第二个值求一次异或,这样可以还原成第一个值。

4. 求反 ~

1变0;0变1。

求反运算只有一个运算项

00000000 00000000 00000000 01101001 ~
----------------------------------------
11111111 11111111 11111111 10010110

移位运算


带符号右移位

所有位整体向右移动,右侧移出部分截断。

侧符号位是0,在左侧补0。
移位

符号位是1,在左侧补1。
移位

不带符号右移位

不管符号位是0还是1,左侧都补0。

1000000000000000000000011101011 >>> 2

结果:
0010000000000000000000000111010

面试题

乘2和除2,除了用 * / 运算符,还可以如何运算?


练一练

1. 获得任意int整数的二进制码

代码

package demo2;

import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) {
        while (true) {
            System.out.print("输入整数的二进制码:");
            int a = new Scanner(System.in).nextInt();

            String code = binaryCode(a);
            System.out.println("二进制码: " + code);
        }
    }

    static String binaryCode(int a) {
        int p = 1 << 31; //最左侧位是1

        String s = "";
        for (int i = 0; i < 32; i++) {
            int r = a & (p >>> i);

            if (r == 0) {
                s += "0";
            } else {
                s += "1";
            }
        }

        return s;
    }
}

2. int整数的32位,分拆成4个byte

在这里插入图片描述
获取左侧第一个字节可以这样做:

1.把左侧第一个字节移动到最右侧
在这里插入图片描述
2. 强转成 byte,这时会截断 int,只保留右侧末尾的一个字节

在这里插入图片描述
以此类推,把每个字节都移动到最右侧再强转成 byte,就可以完成分拆。

代码

package demo2;

import java.util.Scanner;

public class Test2 {
    public static void main(String[] args) {
        while (true) {
            System.out.print("输入整数:");
            int n = new Scanner(System.in).nextInt();
            // int 整数转成四个 byte 值
            byte[] a = split(n);
            for (byte b : a) {
                System.out.println(b);
            }
        }

    }

    static byte[] split(int n) {
        byte[] a = new byte[4];
        for (int i = 0; i < a.length; i++) {
            // n循环右移四次,分别移动 24,16,8,0 位
            a[i] = (byte) (n >> (8 * (3 - i)));
        }

        return a;
    }
}

  1. 四个byte值 合并成一个 int整数

在这里插入图片描述

合并第一个字节

首先准备一个整数0:
在这里插入图片描述
我们打算把这个字节放到左侧第一个字节:

在这里插入图片描述
byte 运算时会被自动转成 int,变成32位,如果符号位是1,左侧会补1:

在这里插入图片描述
我们把这个字节移动到最左侧:

在这里插入图片描述
两个值求位或:
在这里插入图片描述

合并第二个字节

从上一步的结果开始:

在这里插入图片描述

这个个字节会先变成 int如果符号位是1,左侧会补1:
在这里插入图片描述
把它左移到第二个字节位置:
在这里插入图片描述
注意看,左侧8位现在都是1

只留下我们需要的8位,把其他24位都抹成0,像下面这样求个位与运算(两位都是1结果是1,有0就是0)

在这里插入图片描述
把其他位抹成0了,接下来再求位或,这样就完成了第二个字节的合并:
在这里插入图片描述
以此类推,可以继续完成后面两个字节的合并过程。

代码

package demo2;

import java.util.Scanner;

public class Test3 {
    public static void main(String[] args) {
        while (true) {
            byte[] a = new byte[4];
            System.out.println("输入四个byte值:");
            for (int i = 0; i < a.length; i++) {
                a[i] = new Scanner(System.in).nextByte();
            }

            int r = toInt(a);
            System.out.println("合并结果: "+r);
        }
    }

    static int toInt(byte[] a) {
        int r = 0;

        for (int i = 0; i < a.length; i++) {
            // 先向左移动 24,16,8,0 位
            int tmp = a[i] << (8 * (3 - i));
            // 再把不需要的位抹成0
            tmp = tmp & (0b11111111 << (8 * (3 - i)));
            // 再求位或
            r |= tmp;
        }

        return r;
    }
}

代码仓库

https://gitee.com/benwang6/java-review

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java编程基础知识包括以下内容: 1. Java语言特点:Java是一种面向对象的编程语言,具有跨平台性、强类型和静态类型检查、自动内存管理等特点。 2. Java的开发环境:Java的开发环境包括JDK(Java Development Kit)和IDE(Integrated Development Environment),如Eclipse、IntelliJ IDEA等。 3. 基本语法:Java的基本语法包括变量、数据类型、运算符、控制流语句(if-else、for循环、while循环等)、数组等。 4. 面向对象编程Java是一种面向对象的编程语言,支持封装、继承和多态等面向对象的特性。类和对象是Java程序的基本组成单元。 5. 异常处理:Java提供了异常处理机制,通过try-catch-finally块来捕获和处理异常,保证程序的健壮性。 6. 输入输出:Java提供了丰富的输入输出API,可以通过标准输入输出、文件操作、网络通信等方式进行数据的输入和输出。 7. 集合框架:Java提供了一套集合框架,包括List、Set、Map等常用的数据结构和算法,方便处理和操作数据。 8. 多线程编程Java支持多线程编程,可以通过Thread类或Runnable接口创建线程,并使用synchronized关键字实现线程同步。 9. 强大的标准库:Java标准库提供了丰富的API,包括字符串处理、日期时间操作、网络编程、数据库操作等功能。 以上是Java编程的一些基础知识,希望对你有所帮助。如果你有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GTC_GZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值