1064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver/*
2064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * Copyright 2012, Google Inc.
3064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * All rights reserved.
4064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver *
5064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * Redistribution and use in source and binary forms, with or without
6064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * modification, are permitted provided that the following conditions are
7064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * met:
8064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver *
9064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver *     * Redistributions of source code must retain the above copyright
10064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * notice, this list of conditions and the following disclaimer.
11064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver *     * Redistributions in binary form must reproduce the above
12064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * copyright notice, this list of conditions and the following disclaimer
13064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * in the documentation and/or other materials provided with the
14064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * distribution.
15064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver *     * Neither the name of Google Inc. nor the names of its
16064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * contributors may be used to endorse or promote products derived from
17064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * this software without specific prior written permission.
18064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver *
19064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver */
31064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver
32064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruverpackage org.jf.util;
33064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver
34064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruverpublic abstract class NibbleUtils {
35064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver    /**
36064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     * Extracts the high signed 4-bit nibble from the least significant
37064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     * byte of the given value
38064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     * @param value the value to extract the nibble from
39064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     * @return the extracted signed nibble value
40064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     */
41064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver    public static int extractHighSignedNibble(int value) {
42064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver        return (value << 24) >> 28;
43064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver    }
44064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver
45064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver    /**
46064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     * Extracts the low signed 4-bit nibble from the least significant
47064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     * byte of the given value
48064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     * @param value the value to extract the nibble from
49064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     * @return the extracted signed nibble value
50064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     */
51064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver    public static int extractLowSignedNibble(int value) {
52064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver        return (value << 28) >> 28;
53064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver    }
54064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver
55064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver    /**
56064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     * Extracts the high unsigned 4-bit nibble from the least significant
57064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     * byte of the given value
58064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     * @param value the value to extract the nibble from
59064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     * @return the extracted unsigned nibble value
60064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     */
61064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver    public static int extractHighUnsignedNibble(int value) {
62064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver        return (value & 0xF0) >>> 4;
63064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver    }
64064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver
65064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver    /**
66064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     * Extracts the low unsigned 4-bit nibble from the least significant
67064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     * byte of the given value
68064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     * @param value the value to extract the nibble from
69064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     * @return the extracted unsigned nibble value
70064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver     */
71064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver    public static int extractLowUnsignedNibble(int value) {
72064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver        return value & 0x0F;
73064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver    }
74064d77c3ad2869aeb34f012f997e054e779e0a29Ben Gruver}
75