// lognot().

// General includes.
#include "cl_sysdep.h"

// Specification.
#include "cln/integer.h"


// Implementation.

#include "cl_I.h"
#include "cl_DS.h"
#include "cl_I_log.h"

namespace cln {

const cl_I lognot (const cl_I& x)
    { if (fixnump(x)) // Fixnum -> ganz einfach:
        { // bitweise als Fixnum zurück
          return cl_I_from_word(x.word ^ cl_combine(0,~(cl_uint)0));
        }
        else
        // Bignum:
        { CL_ALLOCA_STACK;
          var uintD* MSDptr;
          var uintC n;
          BN_to_NDS(x, MSDptr=,n=,); // NDS zu x bilden
          // Es ist n>=bn_minlength,
          // und die ersten intDsize+1 Bit sind nicht alle gleich.
          not_loop_msp(MSDptr,n); // mit NOT komplementieren,
                          // wegen n>0 wird auch das Vorzeichenbit umgedreht
          // MSDptr/n/LSDptr ist immer noch eine NDS, da n>=bn_minlength
          // und die ersten intDsize+1 Bit nicht alle gleich sind.
          return NDS_to_I(MSDptr,n); // Ergebnis als Integer
    }   }

}  // namespace cln
