summaryrefslogtreecommitdiff
path: root/libjava/gnu/gcj/awt/BitMaskExtent.java
blob: 2da39f86196548a8c0123115ec2b37251eea3f6e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/* Copyright © 2000  Free Software Foundation

   This file is part of libgcj.

This software is copyrighted work licensed under the terms of the
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
details.  */

package gnu.gcj.awt;

/** 
 * Simple transparent utility class that can be used to perform bit
 * mask extent calculations.
 */
public final class BitMaskExtent
{
  /** The number of the least significant bit of the bit mask extent. */
  public byte leastSignificantBit;

  /** The number of bits in the bit mask extent. */
  public byte bitWidth;
  
  /**
   * Set the bit mask. This will calculate and set the leastSignificantBit
   * and bitWidth fields.
   *
   * @see #leastSignificantBit
   * @see #bitWidth
   */
  public void setMask(long mask)
  {
    leastSignificantBit = 0;
    bitWidth = 0;
    if (mask == 0) return;
    long shiftMask = mask;
    for (; (shiftMask&1) == 0; shiftMask >>>=1) leastSignificantBit++;
    for (; (shiftMask&1) != 0; shiftMask >>>=1) bitWidth++;
    
    if (shiftMask != 0)
      throw new IllegalArgumentException("mask must be continuous");
  }
  
  /** 
   * Calculate the bit mask based on the values of the
   * leastSignificantBit and bitWidth fields.
   */
  public long toMask()
  {
    return ((1<<bitWidth)-1) << leastSignificantBit;
  }  
}