JAVA 字节运算 取低5位 获取低位第一位

1、JAVA 取低5位

什么是取低5位
在计算机中,每个数字都是以二进制形式存储的。一个二进制数字可以由多个位组成,每一位都可以是 0 或者 1。取低5位即表示只取二进制数字的最后5位(从右向左数)。

取低5位的方法
在 JAVA 中,可以通过按位与运算符 & 和一个二进制掩码来取低5位。二进制掩码是一个具有5个1和其他位置0的二进制数字。

int number = 255; // 二进制为 11111111
int mask = 31; // 二进制为 00011111  0x1F

int result = number & mask; // 取低5位   (& 每位进行&运算都为1则为1 有一个为0就为0)
System.out.println(result); // 输出为 31

2、JAVA 获取低位第一位、取低位第四位

//获取低位第一位
byte ver0 = 0x60 & 0x01;//01100000
byte ver00 = 0x61 & 0x01;//01100001
//获取低位第四位
byte ver4 = (0x61>>4) & 0x01;//01100001
byte ver44 = (0x79>>4) & 0x01;//01111001
System.out.println("vero = "+ver0+" ver00="+ver00+" ver4="+ver4+" ver44="+ver44);//vero = 0 ver00=1 ver4=0 ver44=1

### Java运算练习题及相关解析 #### 一、基础知识回顾 Java中的运算是基于二进制数的操作,主要包括按与(&)、按或(|)、按异或(^)、按反(~),以及左移(<<)和右移(>>)操作。这些运算符可以直接作用于整型变量的每一[^3]。 以下是常见的运算符及其功能: - **& (按与)**:两个相应都为1时结果才为1。 - **| (按或)**:只要有一个相应的为1,则结果就为1。 - **^ (按异或)**:当两不同时结果为1;相同时结果为0。 - **~ (按反)**:将所有的0变为1,所有的1变为0。 - **<< (左移)**:向左移动指定的数,在低位补零。 - **>> (带符号右移)**:向右移动指定的数,高由原数值的符号填充。 - **>>> (无符号右移)**:无论正负数,高均用0填充。 --- #### 二、典型练习题及解析 ##### 1. 判断奇偶性 编写一个程序,利用运算判断给定的一个整数是否为奇数。 ```java public class OddEvenCheck { public static boolean isOdd(int num) { return (num & 1) != 0; } public static void main(String[] args) { int number = 7; System.out.println(isOdd(number)); // 输出 true } } ``` **解析**: 通过`num & 1`可以提有效(LSB)。如果LSB为1,则该数为奇数;否则为偶数。 --- ##### 2. 计算二进制中1的数量 写一段代码计算某个整数的二进制表示中有多少个1。 ```java public class CountBits { public static int countOnes(int n) { int count = 0; while (n != 0) { count += (n & 1); n >>= 1; // 右移一 } return count; } public static void main(String[] args) { int number = 9; // 二进制形式为 1001 System.out.println(countOnes(number)); // 输出 2 } } ``` **解析**: 每次出最右侧的一并累加到计数器中,随后将整个数字右移一直到其值为0为止。 --- ##### 3. 实现交换两数而不借助额外空间 尝试仅使用运算完成两个整数之间的互换。 ```java public class SwapNumbers { public static void swapWithoutTemp(int a, int b) { System.out.println("Before swapping: a=" + a + ", b=" + b); a ^= b; // 步骤1 b ^= a; // 步骤2 a ^= b; // 步骤3 System.out.println("After swapping: a=" + a + ", b=" + b); } public static void main(String[] args) { swapWithoutTemp(5, 8); // Before: a=5,b=8 After: a=8,b=5 } } ``` **解析**: 此方法依赖XOR特性来达到无需临时存储即可交换的目的。具体原理如下: 假设初始状态a=x,y=b=y; 执行三次XOR之后得到最终的结果即完成了两者置上的调换过程。 --- ##### 4. 左移实现乘法 创建函数验证能否通过简单的左移代替特定倍率下的乘积运算。 ```java public class MultiplyByShifts { public static int multiplyByPowerOfTwo(int value, int power) { return value << power; } public static void main(String[] args) { int result = multiplyByPowerOfTwo(3, 2); // 等价于 3 * 2² = 12 System.out.println(result); // 输出 12 } } ``` **解析**: 对于任何非负整数k来说,把某数x左移k相当于将其乘以2ᵏ次方。 --- ##### 5. 使用掩码设置/清除特定 定义一组宏用于快速修改目标字节串内的某些固定范围标志的状态。 ```java // 假设我们想控制第N开关 final int MASK_SET_BIT_NTH = 1 << N; // 设置第N final int MASK_CLEAR_BIT_NTH = ~(1 << N); // 清除第N int applyMask(int originalValue, boolean setFlag) { if(setFlag){ return originalValue | MASK_SET_BIT_NTH ; }else{ return originalValue & MASK_CLEAR_BIT_NTH ; } } System.out.println(Integer.toBinaryString(applyMask(0b1111_0000 ,true))); // 结果应显示新增激活标记后的模式 System.out.println(Integer.toBinaryString(applyMask(0b1111_0000 ,false))); // 对照组则呈现未改变前原始样式 ``` **解析**: 这里展示了如何构建合适的mask并通过逻辑组合调整单一比特域的行为方式。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值