Day03 JavaBasic02

本文深入探讨了位运算符在求整数绝对值、找出不同数值、判断2的整数次幂、计算二进制中1的数量及计算二进制位差异的应用。通过具体实例和代码,展示了位运算在解决特定问题时的高效性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 用位运算符求一个整数(int)的绝对值(要求有代码和截图哈)
 package com.cskaoyan.homework;

/**
 * 用位运算符求一个整数(int)的绝对值
 * a = -6    ->    10000000 00000000 00000000 00000110
 *                 11111111 11111111 11111111 11111001
 *                 11111111 11111111 11111111 11111010
 * a >> 31   ->    11111111 11111111 11111111 11111111  有符号右移31位,则32位的值都为原符号位的值
 * a + (a >> 31)   11111111 11111111 11111111 11111001
 * (a + (a >> 31)) ^ (a >> 31)
 *                 00000000 00000000 00000000 00000110
 *
 */
public class work01 {
    public static void main(String[] args){
        int a = -6;
        int result = (a + (a >> 31)) ^ (a >> 31) ;
        System.out.println(a + "的绝对值为:" + result);
    }
}
  1. 有三个int变量,a, b, c假设三个变量中有两个变量的值相同,请问如何快速求出,那个和其他两个变量不同的第三个变量的值?(代码+截图)
package com.cskaoyan.homework;

/**
 * 有三个int变量,a, b, c假设三个变量中有两个变量的值相同,请问如何快速求出,那个和其他两个变量不同的第三个变量的值?
 */
public class work02 {
    public static void main(String[] args){
        int a = 2;
        int b = 3;
        int c = 2;
        //因为两数相等,所以只有三种情况:a=b或者a=c或者b=c
        //所以可以采用三目运算符嵌套的方法来做
        int result = (a == b) ? c : (a == c ? b : a);
        System.out.println(a + "," + b + "," + c + "这3个数中,与其他两个数不相等的数为:" + result);
    }
}
  1. 任给一个i在这里插入代码片nt类型的正整数,如何判断该整数的值,是否是2的整数次幂?(代码+截图)
package com.cskaoyan.homework;

/**
 *任给一个int类型的正整数,如何判断该整数的值,是否是2的整数次幂?
 * a = 16       ->  00000000 00000000 00000000 00010000
 * b = a - 1    ->  00000000 00000000 00000000 00001111
 * i = a & b    ->  00000000 00000000 00000000 00000000
 *
 * a = 15       ->  00000000 00000000 00000000 00001111
 * b = a - 1    ->  00000000 00000000 00000000 00001110
 * i = a & b    ->  00000000 00000000 00000000 00001110
 */
public class work03 {
    public static void main(String[] args){
        int a = 15;
        int b = a - 1;
        int i = a & b ;
        if(i == 0)
            System.out.println(a + "是2的整数次幂");
        else
            System.out.println(a + "不是2的整数次幂");

    }
}

附加题
1.一个十进制整数(int),的二进制表示形式(补码)中,包含的1个数? 比如0x80000000 中只包含一个1 (代码加截图)

package com.cskaoyan.homework;

/**
 * 一个十进制整数(int),的二进制表示形式(补码)中,包含的1个数? 比如0x80000000 中只包含一个1
 * n = 0x80000000  ->  10000000 00000000 00000000 00000000  i = 1
 * n - 1           ->  01111111 11111111 11111111 11111111
 * n = n & (n - 1) ->  00000000 00000000 00000000 00000000  退出
 *
 * n = 0x00000007  ->  00000000 00000000 00000000 00000111  i = 1
 * n - 1           ->  00000000 00000000 00000000 00000110
 * n = n & (n - 1) ->  00000000 00000000 00000000 00000110  i = 2
 * n - 1           ->  00000000 00000000 00000000 00000011
 * n = n & (n - 1) ->  00000000 00000000 00000000 00000010  i = 3
 * n - 1           ->  00000000 00000000 00000000 00000001
 * n = n & (n - 1) ->  00000000 00000000 00000000 00000000  退出
 */
public class add01 {
    public static void main(String[] args){
        int n = 7;
        int i = 0;
        while(n != 0) {
            i++;
            n = n & (n - 1);
        }
        System.out.println("该整数的二进制形式中含有" + i + "个1。");
    }
}

附加题
2.有两个整数m,n,计算需要改变m的二进制表示(补码)中的多少位,才能得到n?(代码 + 截图) 比如10的二进制补码为1010,13的二进制补码表示为1101,那么至少需要改变1010中的3位才能得到1101

package com.cskaoyan.homework;

/**
 * 有两个整数m,n,计算需要改变m的二进制表示(补码)中的多少位,才能得到n?
 * m = 10         ->  00000000 00000000 00000000 00001010
 * n = 13         ->  00000000 00000000 00000000 00001101
 * temp = m ^ n   ->  00000000 00000000 00000000 00000111
 * 再由add01中的方法计算可知m和n有3位不同
 */
public class add02 {
    public static void main(String[] args){
        int m = 10;
        int n = 13;
        int temp = m ^ n;//先将两个数异或
        int i=0;
        //注意这里和add01的关系
        while(temp != 0){
            i++;
            temp = ( temp &( temp - 1));//求异或后1的个数
        }
        System.out.println("需要改变m的二进制表示(补码)中的" + i + "位。");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值