This is an automated email from the ASF dual-hosted git repository.
garydgregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git
The following commit(s) were added to refs/heads/master by this push:
new ddf5625d5 Fix int mask sign extension in BitField long methods (#1711)
ddf5625d5 is described below
commit ddf5625d50a4c2fbe9346f12a26fc60e68af894e
Author: alhuda <[email protected]>
AuthorDate: Thu Jun 18 18:25:34 2026 +0530
Fix int mask sign extension in BitField long methods (#1711)
* fix int mask sign extension in BitField long methods
* Derive shiftCount from this.mask in BitField(int)
---
src/main/java/org/apache/commons/lang3/BitField.java | 4 ++--
.../java/org/apache/commons/lang3/BitFieldTest.java | 19 +++++++++++++++++++
2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/src/main/java/org/apache/commons/lang3/BitField.java
b/src/main/java/org/apache/commons/lang3/BitField.java
index d84120218..247460c06 100644
--- a/src/main/java/org/apache/commons/lang3/BitField.java
+++ b/src/main/java/org/apache/commons/lang3/BitField.java
@@ -82,8 +82,8 @@ public class BitField {
* @param mask the mask specifying which bits apply to this BitField. Bits
that are set in this mask are the bits that this BitField operates on.
*/
public BitField(final int mask) {
- this.mask = mask;
- this.shiftCount = mask == 0 ? 0 : Integer.numberOfTrailingZeros(mask);
+ this.mask = Integer.toUnsignedLong(mask);
+ this.shiftCount = this.mask == 0 ? 0 :
Long.numberOfTrailingZeros(this.mask);
}
/**
diff --git a/src/test/java/org/apache/commons/lang3/BitFieldTest.java
b/src/test/java/org/apache/commons/lang3/BitFieldTest.java
index 785cb2ac0..cc53735c6 100644
--- a/src/test/java/org/apache/commons/lang3/BitFieldTest.java
+++ b/src/test/java/org/apache/commons/lang3/BitFieldTest.java
@@ -152,6 +152,25 @@ void testIsAllSet() {
assertTrue(BF_SINGLE.isAllSet(0x4000));
}
+ /**
+ * Tests that an int mask with the high bit set is treated as 32 unsigned
bits on the long methods, instead of being sign-extended into bits 32-63.
+ */
+ @Test
+ void testIntMaskHighBitOnLongHolder() {
+ final BitField bit31 = new BitField(0x80000000);
+ assertEquals(bit31.getRawValue(-1L), 0x80000000L);
+ assertEquals(bit31.getValue(-1L), 1L);
+ assertEquals(bit31.clear(-1L), 0xFFFFFFFF7FFFFFFFL);
+ assertEquals(bit31.set(0L), 0x80000000L);
+ assertTrue(bit31.isSet(0x80000000L));
+ assertTrue(bit31.isAllSet(0x80000000L));
+
+ final BitField topByte = new BitField(0xFF000000);
+ assertEquals(topByte.getRawValue(-1L), 0xFF000000L);
+ assertEquals(topByte.getValue(-1L), 0xFFL);
+ assertEquals(topByte.clear(-1L), 0xFFFFFFFF00FFFFFFL);
+ }
+
/**
* test the isSet() method.
*/