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.
      */

Reply via email to