PageRenderTime 40ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/cln-1.3.2/src/integer/bitwise/cl_I_ldb.cc

#
C++ | 52 lines | 26 code | 8 blank | 18 comment | 4 complexity | 656dfca97644f772e684e4ee1391cd20 MD5 | raw file
Possible License(s): GPL-2.0
  1. // ldb().
  2. // General includes.
  3. #include "base/cl_sysdep.h"
  4. // Specification.
  5. #include "cln/integer.h"
  6. // Implementation.
  7. #include "cln/integer.h"
  8. #include "integer/cl_I.h"
  9. #include "integer/bitwise/cl_I_byte.h"
  10. namespace cln {
  11. const cl_I ldb (const cl_I& n, const cl_byte& b)
  12. {
  13. // Methode:
  14. // (ldb (byte s p) n) extrahiere die Bits p,...,p+s-1 von n.
  15. // l:=(integer-length n)
  16. // Falls l <= p :
  17. // Falls n>=0: 0, falls n<0: 2^s - 1 (s Einsenbits).
  18. // Falls p <= l :
  19. // q:=min(p+s,l).
  20. // Extrahiere die Bits p,...,q-1 von n.
  21. // Falls p+s>l und n<0, f?ge p+s-l Einsenbits an (addiere 2^s-2^(l-p)).
  22. var uintC s = b.size;
  23. var uintC p = b.position;
  24. var uintC l = integer_length(n); // l = (integer-length n)
  25. if (l<=p)
  26. // l<=p
  27. if (!minusp(n))
  28. // n>=0
  29. return 0; // 0 als Ergebnis
  30. else
  31. // n<0
  32. return cl_fullbyte(0,s); // 2^s-2^0 als Ergebnis
  33. else
  34. // l>p
  35. { var cl_I erg = ldb_extract(n,p,(p+s<l ? p+s : l));
  36. var uintC lp = l-p;
  37. if ((s>lp) && minusp(n)) // s>l-p und n<0 ?
  38. { return logior(erg,cl_fullbyte(lp,s)); } // setze Bits l-p,...,s-1
  39. // (logisches Exklusiv-Oder oder Addition ginge auch)
  40. else
  41. return erg;
  42. }
  43. }
  44. } // namespace cln