[BACK]Return to clrbit.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / mpz

Diff for /OpenXM_contrib/gmp/mpz/Attic/clrbit.c between version 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2000/09/09 14:12:49 version 1.1.1.3, 2003/08/25 16:06:32
Line 1 
Line 1 
 /* mpz_clrbit -- clear a specified bit.  /* mpz_clrbit -- clear a specified bit.
   
 Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc.  Copyright 1991, 1993, 1994, 1995, 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 23  MA 02111-1307, USA. */
Line 23  MA 02111-1307, USA. */
 #include "gmp-impl.h"  #include "gmp-impl.h"
   
 void  void
 #if __STDC__  
 mpz_clrbit (mpz_ptr d, unsigned long int bit_index)  mpz_clrbit (mpz_ptr d, unsigned long int bit_index)
 #else  
 mpz_clrbit (d, bit_index)  
      mpz_ptr d;  
      unsigned long int bit_index;  
 #endif  
 {  {
   mp_size_t dsize = d->_mp_size;    mp_size_t dsize = d->_mp_size;
   mp_ptr dp = d->_mp_d;    mp_ptr dp = d->_mp_d;
   mp_size_t limb_index;    mp_size_t limb_index;
   
   limb_index = bit_index / BITS_PER_MP_LIMB;    limb_index = bit_index / GMP_NUMB_BITS;
   if (dsize >= 0)    if (dsize >= 0)
     {      {
       if (limb_index < dsize)        if (limb_index < dsize)
         {          {
           dp[limb_index] &= ~((mp_limb_t) 1 << (bit_index % BITS_PER_MP_LIMB));            dp[limb_index] &= ~((mp_limb_t) 1 << (bit_index % GMP_NUMB_BITS));
           MPN_NORMALIZE (dp, dsize);            MPN_NORMALIZE (dp, dsize);
           d->_mp_size = dsize;            d->_mp_size = dsize;
         }          }
Line 67  mpz_clrbit (d, bit_index)
Line 61  mpz_clrbit (d, bit_index)
       if (limb_index > zero_bound)        if (limb_index > zero_bound)
         {          {
           if (limb_index < dsize)            if (limb_index < dsize)
             dp[limb_index] |= (mp_limb_t) 1 << (bit_index % BITS_PER_MP_LIMB);              dp[limb_index] |= (mp_limb_t) 1 << (bit_index % GMP_NUMB_BITS);
           else            else
             {              {
               /* Ugh.  The bit should be cleared outside of the end of the                /* Ugh.  The bit should be cleared outside of the end of the
Line 78  mpz_clrbit (d, bit_index)
Line 72  mpz_clrbit (d, bit_index)
                   dp = d->_mp_d;                    dp = d->_mp_d;
                 }                  }
               MPN_ZERO (dp + dsize, limb_index - dsize);                MPN_ZERO (dp + dsize, limb_index - dsize);
               dp[limb_index] = (mp_limb_t) 1 << (bit_index % BITS_PER_MP_LIMB);                dp[limb_index] = (mp_limb_t) 1 << (bit_index % GMP_NUMB_BITS);
               d->_mp_size = -(limb_index + 1);                d->_mp_size = -(limb_index + 1);
             }              }
         }          }
       else if (limb_index == zero_bound)        else if (limb_index == zero_bound)
         {          {
           dp[limb_index] = ((dp[limb_index] - 1)            dp[limb_index] = ((((dp[limb_index] - 1)
                             | ((mp_limb_t) 1 << (bit_index % BITS_PER_MP_LIMB))) + 1;                                | ((mp_limb_t) 1 << (bit_index % GMP_NUMB_BITS))) + 1)
                               & GMP_NUMB_MASK);
           if (dp[limb_index] == 0)            if (dp[limb_index] == 0)
             {              {
               mp_size_t i;                mp_size_t i;
               for (i = limb_index + 1; i < dsize; i++)                for (i = limb_index + 1; i < dsize; i++)
                 {                  {
                   dp[i] += 1;                    dp[i] = (dp[i] + 1) & GMP_NUMB_MASK;
                   if (dp[i] != 0)                    if (dp[i] != 0)
                     goto fin;                      goto fin;
                 }                  }

Legend:
Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>