Java bitCount()方法

本文通过示例展示了如何使用Java的Integer.bitCount()和Long.bitCount()方法来计算整数二进制表示中1的位数。此外,还介绍了如何将整型和长整型变量转换为二进制字符串。

java.lang.Integer.bitCount()和java.lang.Long.bitCount()方法返回二进制表示中1的位数。有时将此功能称为人口计数。


public class BitCountDemo {

	public static void main(String[] args) {

		int i = 219;
		System.out.println("Number = " + i);

		/*
		 * returns the string representation of the unsigned long value represented by
		 * the argument in binary (base 2)
		 */
		System.out.println("Binary = " + Integer.toBinaryString(i));

		// returns the number of one-bits
		System.out.println("Number of one bits = " + Integer.bitCount(i));

		long l = 219;
		System.out.println("Number = " + l);

		/*
		 * returns the string representation of the unsigned long value represented by
		 * the argument in binary (base 2)
		 */
		System.out.println("Binary = " + Long.toBinaryString(l));

		// returns the number of one-bits
		System.out.println("Number of one bits = " + Long.bitCount(l));
	}

}

Number = 219
Binary = 11011011
Number of one bits = 6
Number = 219
Binary = 11011011
Number of one bits = 6
 

<think>嗯,我现在需要分析Java的BigInteger类的方法。首先,我应该回忆一下BigInteger的基本概念。BigInteger是Java中用来处理任意精度整数运算的类,属于java.math包。当基本数据类型如int或long无法满足大整数运算需求时,就会用到它。接下来,我需要了解它的常用方法,并分类整理。 首先,构造方法。用户通常如何创建BigInteger对象呢?常见的有用字符串构造,比如new BigInteger("123456789")。另外,还有使用byte数组的方式,或者通过valueOf静态方法转换long值。但需要注意,valueOf适用于较小的数,因为long的范围有限。 然后是算术运算方法。BigInteger提供加减乘除等操作,比如add、subtract、multiply、divide。这些方法返回新的BigInteger对象,因为BigInteger是不可变的。还有取模运算mod,但要注意除数不能为零,且mod的结果符号和除数一致。此外,还有取余运算remainder,结果的符号和被除数一致。 接下来是位运算方法。比如and、or、xor、not等位操作,以及shiftLeft和shiftRight进行移位操作。这些在处理大整数的二进制形式时很有用。还有bitCount方法计算二进制中1的个数,bitLength返回二进制位的长度,有助于了解数值的范围。 比较和判断方法也很重要。compareTo用于比较两个BigInteger的大小,返回-1、0或1。equals方法检查数值相等,但要注意类型必须一致。isProbablePrime用于判断该数是否为质数,基于一定的概率,参数是确定性的程度。 类型转换方法。比如转换为int的intValue,long的longValue,但要注意可能的信息丢失。toString方法将数值转为字符串,可以指定基数,比如二进制或十六进制。toByteArray返回二进制补码形式的字节数组。 其他实用方法。比如gcd计算最大公约数,modInverse求模逆元,pow计算幂次方。abs取绝对值,negate取相反数,signum返回符号(-1、0、1)。还有nextProbablePrime返回下一个可能的质数,用于质数生成。 需要注意的几点:BigInteger的不可变性,每次操作都会生成新对象,可能影响性能。运算效率方面,大数运算比基本类型慢很多,需权衡使用场景。线程安全方面,由于不可变性,BigInteger是线程安全的。此外,正确使用mod和remainder的区别,避免负数带来的意外结果。 例如,计算两个大数之和:BigInteger a = new BigInteger("123456789"); BigInteger b = new BigInteger("987654321"); BigInteger sum = a.add(b); 这里sum的值应该是1111111110。 总结的话,BigInteger提供了丰富的数学运算方法,适用于超出基本类型范围的整数运算,但需要注意其不可变性和性能影响。正确选择方法可以处理加密、大数计算等复杂需求。</think>Java的`BigInteger`类用于处理**任意精度的整数运算**,适用于超出`long`类型范围的大整数操作。以下从核心方法、使用场景和注意事项逐步分析: --- ### **一、创建BigInteger对象** #### 1. 构造方法 - **字符串构造**:常用方式,支持十进制、二进制等格式 ```java BigInteger num = new BigInteger("12345678901234567890"); // 十进制 BigInteger bin = new BigInteger("101010", 2); // 二进制 ``` - **字节数组构造**:基于二进制补码形式的字节数组 ```java byte[] bytes = {0x12, 0x34}; BigInteger fromBytes = new BigInteger(bytes); ``` - **静态工厂方法**:`valueOf`(适用于较小数值) ```java BigInteger smallNum = BigInteger.valueOf(100L); ``` --- ### **二、算术运算方法** #### 1. 基本运算 - **加法**:`add(BigInteger val)` $$ \text{result} = a + b $$ ```java BigInteger a = new BigInteger("100"); BigInteger b = new BigInteger("200"); BigInteger sum = a.add(b); // 300 ``` - **减法**:`subtract(BigInteger val)` - **乘法**:`multiply(BigInteger val)` - **除法**:`divide(BigInteger val)` ```java BigInteger quotient = a.divide(b); // 需确保除数非零 ``` #### 2. 取模与余数 - **取模**:`mod(BigInteger m)` 结果符号与模数一致,要求`m > 0` ```java BigInteger modResult = a.mod(BigInteger.TEN); // 符号与10一致 ``` - **取余**:`remainder(BigInteger val)` 结果符号与被除数一致 ```java BigInteger rem = a.remainder(b); ``` --- ### **三、位运算与二进制操作** #### 1. 位操作 - **与/或/异或/非**:`and`, `or`, `xor`, `not` ```java BigInteger result = a.and(b); // 按位与 ``` - **移位操作**: ```java BigInteger shiftedLeft = a.shiftLeft(2); // 左移2位(等效乘以4) BigInteger shiftedRight = a.shiftRight(1); // 右移1位(等效除以2) ``` #### 2. 二进制信息 - **位长度**:`bitLength()` 返回二进制位数(不含符号位) ```java int bits = a.bitLength(); // 若a=8(二进制1000),返回4 ``` - **位测试**:`testBit(int n)` 检查第`n`位是否为1(从0开始) ```java boolean isSet = a.testBit(3); // 检查第4位 ``` --- ### **四、比较与判断方法** #### 1. 比较操作 - **大小比较**:`compareTo(BigInteger val)` 返回`-1`、`0`或`1` ```java int cmp = a.compareTo(b); // a < b → -1 ``` - **相等性**:`equals(Object x)` 需类型严格匹配(如`BigInteger`与`Integer`不相等) #### 2. 质数判断 - **概率性质数测试**:`isProbablePrime(int certainty)` 参数`certainty`越高,准确性越高(但耗时增加) ```java boolean isPrime = a.isProbablePrime(100); // 错误概率 < 2^(-100) ``` --- ### **五、类型转换与工具方法** #### 1. 转换为基本类型 - `intValue()`, `longValue()` 可能丢失精度(如数值过大时) ```java int intVal = a.intValue(); // 溢出时返回低32位 ``` #### 2. 字符串与字节数组 - `toString(int radix)`:按指定进制输出 ```java String hex = a.toString(16); // 转为十六进制 ``` - `toByteArray()`:返回二进制补码形式的字节数组 --- ### **六、其他实用方法** #### 1. 数学工具 - **最大公约数**:`gcd(BigInteger val)` ```java BigInteger gcd = a.gcd(b); ``` - **模逆元**:`modInverse(BigInteger m)` 求解满足 $$ a \cdot x \equiv 1 \pmod{m} $$ 的`x` ```java BigInteger inverse = a.modInverse(m); // 需a与m互质 ``` #### 2. 符号与绝对值 - **符号函数**:`signum()` 返回`-1`(负数)、`0`或`1`(正数) - **绝对值**:`abs()` ```java BigInteger absVal = a.abs(); ``` --- ### **七、注意事项** 1. **不可变性**:每次运算生成新对象,频繁操作需注意内存和性能。 2. **性能问题**:大数运算较慢,避免在循环中过度使用。 3. **异常处理**:如除零操作会抛出`ArithmeticException`。 4. **线程安全**:因不可变,多线程环境下安全。 --- ### **示例:计算阶乘** ```java public static BigInteger factorial(int n) { BigInteger result = BigInteger.ONE; for (int i = 1; i <= n; i++) { result = result.multiply(BigInteger.valueOf(i)); } return result; } ``` 通过合理使用`BigInteger`,可解决大整数运算、密码学、高精度计算等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值