2 * arbitrary precision integers
3 * Copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 * arbitrary precision integers.
24 * @author Michael Niedermayer <michaelni@gmx.at>
30 AVInteger
av_add_i(AVInteger a
, AVInteger b
){
33 for(i
=0; i
<AV_INTEGER_SIZE
; i
++){
34 carry
= (carry
>>16) + a
.v
[i
] + b
.v
[i
];
40 AVInteger
av_sub_i(AVInteger a
, AVInteger b
){
43 for(i
=0; i
<AV_INTEGER_SIZE
; i
++){
44 carry
= (carry
>>16) + a
.v
[i
] - b
.v
[i
];
51 * returns the rounded down value of the logarithm of base 2 of the given AVInteger.
52 * this is simply the index of the most significant bit which is 1. Or 0 of all bits are 0
54 int av_log2_i(AVInteger a
){
57 for(i
=AV_INTEGER_SIZE
-1; i
>=0; i
--){
59 return av_log2_16bit(a
.v
[i
]) + 16*i
;
64 AVInteger
av_mul_i(AVInteger a
, AVInteger b
){
67 int na
= (av_log2_i(a
)+16) >> 4;
68 int nb
= (av_log2_i(b
)+16) >> 4;
70 memset(&out
, 0, sizeof(out
));
76 for(j
=i
; j
<AV_INTEGER_SIZE
&& j
-i
<=nb
; j
++){
77 carry
= (carry
>>16) + out
.v
[j
] + a
.v
[i
]*b
.v
[j
-i
];
86 * returns 0 if a==b, 1 if a>b and -1 if a<b.
88 int av_cmp_i(AVInteger a
, AVInteger b
){
90 int v
= (int16_t)a
.v
[AV_INTEGER_SIZE
-1] - (int16_t)b
.v
[AV_INTEGER_SIZE
-1];
91 if(v
) return (v
>>16)|1;
93 for(i
=AV_INTEGER_SIZE
-2; i
>=0; i
--){
94 int v
= a
.v
[i
] - b
.v
[i
];
95 if(v
) return (v
>>16)|1;
102 * @param s the number of bits by which the value should be shifted right, may be negative for shifting left
104 AVInteger
av_shr_i(AVInteger a
, int s
){
108 for(i
=0; i
<AV_INTEGER_SIZE
; i
++){
109 int index
= i
+ (s
>>4);
111 if(index
+1<AV_INTEGER_SIZE
&& index
+1>=0) v
= a
.v
[index
+1]<<16;
112 if(index
<AV_INTEGER_SIZE
&& index
>=0) v
+= a
.v
[index
];
113 out
.v
[i
]= v
>> (s
&15);
120 * @param quot a/b will be stored here
122 AVInteger
av_mod_i(AVInteger
*quot
, AVInteger a
, AVInteger b
){
123 int i
= av_log2_i(a
) - av_log2_i(b
);
125 if(!quot
) quot
= "_temp
;
127 assert((int16_t)a
[AV_INTEGER_SIZE
-1] >= 0 && (int16_t)b
[AV_INTEGER_SIZE
-1] >= 0);
128 assert(av_log2(b
)>=0);
133 memset(quot
, 0, sizeof(AVInteger
));
136 *quot
= av_shr_i(*quot
, -1);
137 if(av_cmp_i(a
, b
) >= 0){
149 AVInteger
av_div_i(AVInteger a
, AVInteger b
){
151 av_mod_i("
, a
, b
);
156 * converts the given int64_t to an AVInteger.
158 AVInteger
av_int2i(int64_t a
){
162 for(i
=0; i
<AV_INTEGER_SIZE
; i
++){
170 * converts the given AVInteger to an int64_t.
171 * if the AVInteger is too large to fit into an int64_t,
172 * then only the least significant 64bit will be used
174 int64_t av_i2int(AVInteger a
){
176 int64_t out
=(int8_t)a
.v
[AV_INTEGER_SIZE
-1];
178 for(i
= AV_INTEGER_SIZE
-2; i
>=0; i
--){
179 out
= (out
<<16) + a
.v
[i
];
188 const uint8_t ff_log2_tab
[256]={
189 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
190 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
191 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
192 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
193 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
194 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
195 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
196 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
202 for(a
=7; a
<256*256*256; a
+=13215){
203 for(b
=3; b
<256*256*256; b
+=27118){
204 AVInteger ai
= av_int2i(a
);
205 AVInteger bi
= av_int2i(b
);
207 assert(av_i2int(ai
) == a
);
208 assert(av_i2int(bi
) == b
);
209 assert(av_i2int(av_add_i(ai
,bi
)) == a
+b
);
210 assert(av_i2int(av_sub_i(ai
,bi
)) == a
-b
);
211 assert(av_i2int(av_mul_i(ai
,bi
)) == a
*b
);
212 assert(av_i2int(av_shr_i(ai
, 9)) == a
>>9);
213 assert(av_i2int(av_shr_i(ai
,-9)) == a
<<9);
214 assert(av_i2int(av_shr_i(ai
, 17)) == a
>>17);
215 assert(av_i2int(av_shr_i(ai
,-17)) == a
<<17);
216 assert(av_log2_i(ai
) == av_log2(a
));
217 assert(av_i2int(av_div_i(ai
,bi
)) == a
/b
);