1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2014 The Bitcoin developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 #include "arith_uint256.h"
9 #include "utilstrencodings.h"
10 #include "crypto/common.h"
15 template <unsigned int BITS
>
16 base_uint
<BITS
>::base_uint(const std::string
& str
)
21 template <unsigned int BITS
>
22 base_uint
<BITS
>& base_uint
<BITS
>::operator<<=(unsigned int shift
)
24 base_uint
<BITS
> a(*this);
25 for (int i
= 0; i
< WIDTH
; i
++)
29 for (int i
= 0; i
< WIDTH
; i
++) {
30 if (i
+ k
+ 1 < WIDTH
&& shift
!= 0)
31 pn
[i
+ k
+ 1] |= (a
.pn
[i
] >> (32 - shift
));
33 pn
[i
+ k
] |= (a
.pn
[i
] << shift
);
38 template <unsigned int BITS
>
39 base_uint
<BITS
>& base_uint
<BITS
>::operator>>=(unsigned int shift
)
41 base_uint
<BITS
> a(*this);
42 for (int i
= 0; i
< WIDTH
; i
++)
46 for (int i
= 0; i
< WIDTH
; i
++) {
47 if (i
- k
- 1 >= 0 && shift
!= 0)
48 pn
[i
- k
- 1] |= (a
.pn
[i
] << (32 - shift
));
50 pn
[i
- k
] |= (a
.pn
[i
] >> shift
);
55 template <unsigned int BITS
>
56 base_uint
<BITS
>& base_uint
<BITS
>::operator*=(uint32_t b32
)
59 for (int i
= 0; i
< WIDTH
; i
++) {
60 uint64_t n
= carry
+ (uint64_t)b32
* pn
[i
];
61 pn
[i
] = n
& 0xffffffff;
67 template <unsigned int BITS
>
68 base_uint
<BITS
>& base_uint
<BITS
>::operator*=(const base_uint
& b
)
70 base_uint
<BITS
> a
= *this;
72 for (int j
= 0; j
< WIDTH
; j
++) {
74 for (int i
= 0; i
+ j
< WIDTH
; i
++) {
75 uint64_t n
= carry
+ pn
[i
+ j
] + (uint64_t)a
.pn
[j
] * b
.pn
[i
];
76 pn
[i
+ j
] = n
& 0xffffffff;
83 template <unsigned int BITS
>
84 base_uint
<BITS
>& base_uint
<BITS
>::operator/=(const base_uint
& b
)
86 base_uint
<BITS
> div
= b
; // make a copy, so we can shift.
87 base_uint
<BITS
> num
= *this; // make a copy, so we can subtract.
88 *this = 0; // the quotient.
89 int num_bits
= num
.bits();
90 int div_bits
= div
.bits();
92 throw uint_error("Division by zero");
93 if (div_bits
> num_bits
) // the result is certainly 0.
95 int shift
= num_bits
- div_bits
;
96 div
<<= shift
; // shift so that div and num align.
100 pn
[shift
/ 32] |= (1 << (shift
& 31)); // set a bit of the result.
102 div
>>= 1; // shift back.
105 // num now contains the remainder of the division.
109 template <unsigned int BITS
>
110 int base_uint
<BITS
>::CompareTo(const base_uint
<BITS
>& b
) const
112 for (int i
= WIDTH
- 1; i
>= 0; i
--) {
121 template <unsigned int BITS
>
122 bool base_uint
<BITS
>::EqualTo(uint64_t b
) const
124 for (int i
= WIDTH
- 1; i
>= 2; i
--) {
128 if (pn
[1] != (b
>> 32))
130 if (pn
[0] != (b
& 0xfffffffful
))
135 template <unsigned int BITS
>
136 double base_uint
<BITS
>::getdouble() const
140 for (int i
= 0; i
< WIDTH
; i
++) {
142 fact
*= 4294967296.0;
147 template <unsigned int BITS
>
148 std::string base_uint
<BITS
>::GetHex() const
150 return ArithToUint256(*this).GetHex();
153 template <unsigned int BITS
>
154 void base_uint
<BITS
>::SetHex(const char* psz
)
156 *this = UintToArith256(uint256S(psz
));
159 template <unsigned int BITS
>
160 void base_uint
<BITS
>::SetHex(const std::string
& str
)
165 template <unsigned int BITS
>
166 std::string base_uint
<BITS
>::ToString() const
171 template <unsigned int BITS
>
172 unsigned int base_uint
<BITS
>::bits() const
174 for (int pos
= WIDTH
- 1; pos
>= 0; pos
--) {
176 for (int bits
= 31; bits
> 0; bits
--) {
177 if (pn
[pos
] & 1 << bits
)
178 return 32 * pos
+ bits
+ 1;
186 // Explicit instantiations for base_uint<256>
187 template base_uint
<256>::base_uint(const std::string
&);
188 template base_uint
<256>& base_uint
<256>::operator<<=(unsigned int);
189 template base_uint
<256>& base_uint
<256>::operator>>=(unsigned int);
190 template base_uint
<256>& base_uint
<256>::operator*=(uint32_t b32
);
191 template base_uint
<256>& base_uint
<256>::operator*=(const base_uint
<256>& b
);
192 template base_uint
<256>& base_uint
<256>::operator/=(const base_uint
<256>& b
);
193 template int base_uint
<256>::CompareTo(const base_uint
<256>&) const;
194 template bool base_uint
<256>::EqualTo(uint64_t) const;
195 template double base_uint
<256>::getdouble() const;
196 template std::string base_uint
<256>::GetHex() const;
197 template std::string base_uint
<256>::ToString() const;
198 template void base_uint
<256>::SetHex(const char*);
199 template void base_uint
<256>::SetHex(const std::string
&);
200 template unsigned int base_uint
<256>::bits() const;
202 // This implementation directly uses shifts instead of going
203 // through an intermediate MPI representation.
204 arith_uint256
& arith_uint256::SetCompact(uint32_t nCompact
, bool* pfNegative
, bool* pfOverflow
)
206 int nSize
= nCompact
>> 24;
207 uint32_t nWord
= nCompact
& 0x007fffff;
209 nWord
>>= 8 * (3 - nSize
);
213 *this <<= 8 * (nSize
- 3);
216 *pfNegative
= nWord
!= 0 && (nCompact
& 0x00800000) != 0;
218 *pfOverflow
= nWord
!= 0 && ((nSize
> 34) ||
219 (nWord
> 0xff && nSize
> 33) ||
220 (nWord
> 0xffff && nSize
> 32));
224 uint32_t arith_uint256::GetCompact(bool fNegative
) const
226 int nSize
= (bits() + 7) / 8;
227 uint32_t nCompact
= 0;
229 nCompact
= GetLow64() << 8 * (3 - nSize
);
231 arith_uint256 bn
= *this >> 8 * (nSize
- 3);
232 nCompact
= bn
.GetLow64();
234 // The 0x00800000 bit denotes the sign.
235 // Thus, if it is already set, divide the mantissa by 256 and increase the exponent.
236 if (nCompact
& 0x00800000) {
240 assert((nCompact
& ~0x007fffff) == 0);
242 nCompact
|= nSize
<< 24;
243 nCompact
|= (fNegative
&& (nCompact
& 0x007fffff) ? 0x00800000 : 0);
247 uint256
ArithToUint256(const arith_uint256
&a
)
250 for(int x
=0; x
<a
.WIDTH
; ++x
)
251 WriteLE32(b
.begin() + x
*4, a
.pn
[x
]);
254 arith_uint256
UintToArith256(const uint256
&a
)
257 for(int x
=0; x
<b
.WIDTH
; ++x
)
258 b
.pn
[x
] = ReadLE32(a
.begin() + x
*4);