version 1.1.1.2, 2000/09/09 14:12:27 |
version 1.1.1.3, 2003/08/25 16:06:20 |
|
|
/* mpn_scan1 -- Scan from a given bit position for the next set bit. |
/* mpn_scan1 -- Scan from a given bit position for the next set bit. |
|
|
Copyright (C) 1994, 1996 Free Software Foundation, Inc. |
Copyright 1994, 1996, 2001, 2002 Free Software Foundation, Inc. |
|
|
This file is part of the GNU MP Library. |
This file is part of the GNU MP Library. |
|
|
Line 28 MA 02111-1307, USA. */ |
|
Line 28 MA 02111-1307, USA. */ |
|
2. Bit index should be 'unsigned'? |
2. Bit index should be 'unsigned'? |
|
|
Argument constraints: |
Argument constraints: |
1. U must sooner ot later have a limb != 0. |
1. U must sooner or later have a limb != 0. |
*/ |
*/ |
|
|
unsigned long int |
unsigned long int |
#if __STDC__ |
|
mpn_scan1 (register mp_srcptr up, |
mpn_scan1 (register mp_srcptr up, |
register unsigned long int starting_bit) |
register unsigned long int starting_bit) |
#else |
|
mpn_scan1 (up, starting_bit) |
|
register mp_srcptr up; |
|
register unsigned long int starting_bit; |
|
#endif |
|
{ |
{ |
mp_size_t starting_word; |
mp_size_t starting_word; |
mp_limb_t alimb; |
mp_limb_t alimb; |
Line 47 mpn_scan1 (up, starting_bit) |
|
Line 41 mpn_scan1 (up, starting_bit) |
|
mp_srcptr p; |
mp_srcptr p; |
|
|
/* Start at the word implied by STARTING_BIT. */ |
/* Start at the word implied by STARTING_BIT. */ |
starting_word = starting_bit / BITS_PER_MP_LIMB; |
starting_word = starting_bit / GMP_NUMB_BITS; |
p = up + starting_word; |
p = up + starting_word; |
alimb = *p++; |
alimb = *p++; |
|
|
/* Mask off any bits before STARTING_BIT in the first limb. */ |
/* Mask off any bits before STARTING_BIT in the first limb. */ |
alimb &= - (mp_limb_t) 1 << (starting_bit % BITS_PER_MP_LIMB); |
alimb &= - (mp_limb_t) 1 << (starting_bit % GMP_NUMB_BITS); |
|
|
while (alimb == 0) |
while (alimb == 0) |
alimb = *p++; |
alimb = *p++; |
|
|
count_leading_zeros (cnt, alimb & -alimb); |
count_trailing_zeros (cnt, alimb); |
return (p - up) * BITS_PER_MP_LIMB - 1 - cnt; |
return (p - up - 1) * GMP_NUMB_BITS + cnt; |
} |
} |