1 package org.jscsi.target.util; 2 3 /** 4 * A utility class with static methods for accessing individual bits of bytes. 5 * <p> 6 * The value of a single bit can be easily retrieved with the {@link #getBit(byte, int)} method. 7 * <p> 8 * Setting a bit is a little bit more complicated. The byte to be changed must be set to the return value of 9 * {@link #getByteWithBitSet(byte, int, boolean)}. 10 * 11 * @author Andreas Ergenzinger 12 */ 13 public final class BitManip { 14 15 /** 16 * Sets a single bit. If the <i>value</i> parameter is <code>true</code>, the bit will be set to <code>one</code>, 17 * and to <code>zero</code> otherwise. All other bits will be left unchanged. 18 * <p> 19 * The bits are numbered in big-endian format, from 0 (LSB) to 7 (MSB). 20 * <p> 21 * <code> 22 * +---+---+---+---+---+---+---+---+<br> 23 * | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | bit number<br> 24 * +---+---+---+---+---+---+---+---+<br> 25 * </code> 26 * 27 * @param b the original byte value 28 * @param bitNumber the big-endian position of the bit to be changed, from 0 to 7 29 * @param value <code>true</code> for <i>1</i>, <code>false</code> for <i>0</i> 30 * @return the edited byte value 31 */ 32 public static final byte getByteWithBitSet (final byte b, final int bitNumber, final boolean value) { 33 34 int number = b; 35 36 if (value) { 37 // make sure bit is set to true 38 int mask = 1; 39 mask <<= bitNumber; 40 number |= mask; 41 } else { 42 int mask = 1; 43 mask <<= bitNumber; 44 mask ^= 255;// flip bits 45 number &= mask; 46 } 47 48 return (byte) number; 49 } 50 51 /** 52 * Returns <code>true</code>, if the bit at the given position is set to <code>one</code> and <code>false</code> if 53 * it is set to <code>zero</code> . The bits are numbered in big-endian format, from 0 (LSB) to 7 (MSB). 54 * <p> 55 * <code> 56 * +---+---+---+---+---+---+---+---+<br> 57 * | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | bit number<br> 58 * +---+---+---+---+---+---+---+---+<br> 59 * </code> 60 * 61 * @param b the byte value in question 62 * @param bitNumber the big-endian position of the bit to be changed, from 0 to 7 63 * @return <code>true</code> if bit is set to <code>one</code>, else <code>false</code> 64 */ 65 public static boolean getBit (final byte b, final int bitNumber) { 66 int number = b; 67 number >>>= bitNumber; 68 number &= 1; 69 if (number == 1) return true; 70 return false; 71 } 72 }