Home | History | Annotate | Download | only in BaseLib
      1 /*++
      2 
      3 Copyright (c) 2004 - 2006, Intel Corporation. All rights reserved.<BR>
      4 This program and the accompanying materials
      5 are licensed and made available under the terms and conditions of the BSD License
      6 which accompanies this distribution.  The full text of the license may be found at
      7 http://opensource.org/licenses/bsd-license.php
      8 
      9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     11 
     12 
     13 Module Name:
     14 
     15   HighBitSet32.c
     16 
     17 Abstract:
     18 
     19   Math worker functions.
     20 
     21 --*/
     22 
     23 #include "BaseLibInternals.h"
     24 
     25 /**
     26   Returns the bit position of the highest bit set in a 32-bit value. Equivalent
     27   to log2(x).
     28 
     29   This function computes the bit position of the highest bit set in the 32-bit
     30   value specified by Operand. If Operand is zero, then -1 is returned.
     31   Otherwise, a value between 0 and 31 is returned.
     32 
     33   @param  Operand The 32-bit operand to evaluate.
     34 
     35   @return Position of the highest bit set in Operand if found.
     36   @retval -1  Operand is zero.
     37 
     38 **/
     39 INTN
     40 EFIAPI
     41 HighBitSet32 (
     42   IN      UINT32                    Operand
     43   )
     44 {
     45   INTN                              BitIndex;
     46 
     47   if (Operand == 0) {
     48     return - 1;
     49   }
     50   for (BitIndex = 31; (INT32)Operand > 0; BitIndex--, Operand <<= 1);
     51   return BitIndex;
     52 }
     53