malachite_base/num/conversion/digits/
mod.rs

1// Copyright © 2025 Mikhail Hogrefe
2//
3// This file is part of Malachite.
4//
5// Malachite is free software: you can redistribute it and/or modify it under the terms of the GNU
6// Lesser General Public License (LGPL) as published by the Free Software Foundation; either version
7// 3 of the License, or (at your option) any later version. See <https://www.gnu.org/licenses/>.
8
9/// [`Digits`](super::traits::Digits), a trait for extracting digits from numbers and constructing
10/// numbers from digits.
11///
12/// # to_digits_asc
13/// ```
14/// use malachite_base::num::conversion::traits::Digits;
15///
16/// assert_eq!(0u8.to_digits_asc(&6u64), &[]);
17/// assert_eq!(2u16.to_digits_asc(&6u32), &[2]);
18/// assert_eq!(
19///     123456u32.to_digits_asc(&3u16),
20///     &[0, 1, 1, 0, 0, 1, 1, 2, 0, 0, 2]
21/// );
22/// ```
23///
24/// # to_digits_desc
25/// ```
26/// use malachite_base::num::conversion::traits::Digits;
27///
28/// assert_eq!(0u8.to_digits_asc(&6u64), &[]);
29/// assert_eq!(2u16.to_digits_asc(&6u32), &[2]);
30/// assert_eq!(
31///     123456u32.to_digits_desc(&3u16),
32///     &[2, 0, 0, 2, 1, 1, 0, 0, 1, 1, 0]
33/// );
34/// ```
35///
36/// # from_digits_asc
37/// ```
38/// use malachite_base::num::conversion::traits::Digits;
39///
40/// assert_eq!(
41///     u8::from_digits_asc(&64, [0u64, 0, 0].iter().cloned()),
42///     Some(0)
43/// );
44/// assert_eq!(
45///     u32::from_digits_asc(&3, [0u64, 1, 1, 0, 0, 1, 1, 2, 0, 0, 2].iter().cloned()),
46///     Some(123456)
47/// );
48/// assert_eq!(
49///     u32::from_digits_asc(&8, [3u16, 7, 1].iter().cloned()),
50///     Some(123)
51/// );
52///
53/// assert!(u64::from_digits_asc(&64, [1u8; 1000].iter().cloned()).is_none());
54/// assert!(u64::from_digits_asc(&2, [2u8].iter().cloned()).is_none());
55/// assert!(u8::from_digits_asc(&1000, [1u16, 2, 3].iter().cloned()).is_none());
56/// ```
57///
58/// # from_digits_desc
59/// ```
60/// use malachite_base::num::conversion::traits::Digits;
61///
62/// assert_eq!(
63///     u8::from_digits_desc(&64, [0u64, 0, 0].iter().cloned()),
64///     Some(0)
65/// );
66/// assert_eq!(
67///     u32::from_digits_desc(&3, [2u64, 0, 0, 2, 1, 1, 0, 0, 1, 1, 0].iter().cloned()),
68///     Some(123456)
69/// );
70/// assert_eq!(
71///     u32::from_digits_desc(&8, [1u16, 7, 3].iter().cloned()),
72///     Some(123)
73/// );
74///
75/// assert!(u64::from_digits_desc(&64, [1u8; 1000].iter().cloned()).is_none());
76/// assert!(u64::from_digits_desc(&2, [2u8].iter().cloned()).is_none());
77/// assert!(u8::from_digits_desc(&1000, [1u16, 2, 3].iter().cloned()).is_none());
78/// ```
79pub mod general_digits;
80/// [`PowerOf2DigitIterable`](super::traits::PowerOf2DigitIterable), a trait for producing
81/// [`PrimitivePowerOf2DigitIterator`](power_of_2_digit_iterable::PrimitivePowerOf2DigitIterator), a
82/// double-ended iterator for iterating over a number's base-$2^k$ digits.
83///
84/// # power_of_2_digits
85/// ```
86/// use itertools::Itertools;
87/// use malachite_base::num::conversion::traits::PowerOf2DigitIterable;
88///
89/// let mut digits = PowerOf2DigitIterable::<u8>::power_of_2_digits(0u8, 2);
90/// assert!(digits.next().is_none());
91///
92/// // 107 = 1101011b
93/// let digits = PowerOf2DigitIterable::<u8>::power_of_2_digits(107u32, 2);
94/// assert_eq!(digits.collect_vec(), &[3, 2, 2, 1]);
95///
96/// let mut digits = PowerOf2DigitIterable::<u8>::power_of_2_digits(0u8, 2);
97/// assert!(digits.next_back().is_none());
98///
99/// // 107 = 1101011b
100/// let digits = PowerOf2DigitIterable::<u8>::power_of_2_digits(107u32, 2);
101/// assert_eq!(digits.rev().collect_vec(), &[1, 2, 2, 3]);
102/// ```
103pub mod power_of_2_digit_iterable;
104/// [`PowerOf2Digits`](super::traits::PowerOf2Digits), a trait for extracting base-$2^k$ $digits
105/// from numbers and constructing numbers from digits.
106///
107/// # to_power_of_2_digits_asc
108/// ```
109/// use malachite_base::num::conversion::traits::PowerOf2Digits;
110///
111/// assert_eq!(
112///     PowerOf2Digits::<u64>::to_power_of_2_digits_asc(&0u8, 6),
113///     &[]
114/// );
115/// assert_eq!(
116///     PowerOf2Digits::<u64>::to_power_of_2_digits_asc(&2u16, 6),
117///     &[2]
118/// );
119/// // 123_10 = 173_8
120/// assert_eq!(
121///     PowerOf2Digits::<u16>::to_power_of_2_digits_asc(&123u32, 3),
122///     &[3, 7, 1]
123/// );
124/// ```
125///
126/// # to_power_of_2_digits_desc
127/// ```
128/// use malachite_base::num::conversion::traits::PowerOf2Digits;
129///
130/// assert_eq!(
131///     PowerOf2Digits::<u64>::to_power_of_2_digits_desc(&0u8, 6),
132///     &[]
133/// );
134/// assert_eq!(
135///     PowerOf2Digits::<u64>::to_power_of_2_digits_desc(&2u16, 6),
136///     &[2]
137/// );
138/// // 123_10 = 173_8
139/// assert_eq!(
140///     PowerOf2Digits::<u16>::to_power_of_2_digits_desc(&123u32, 3),
141///     &[1, 7, 3]
142/// );
143/// ```
144///
145/// # from_power_of_2_digits_asc
146/// ```
147/// use malachite_base::num::conversion::traits::PowerOf2Digits;
148///
149/// assert_eq!(
150///     u8::from_power_of_2_digits_asc(6, [0u64, 0, 0].iter().cloned()),
151///     Some(0)
152/// );
153/// assert_eq!(
154///     u16::from_power_of_2_digits_asc(6, [2u64, 0].iter().cloned()),
155///     Some(2)
156/// );
157/// assert_eq!(
158///     u32::from_power_of_2_digits_asc(3, [3u16, 7, 1].iter().cloned()),
159///     Some(123)
160/// );
161///
162/// assert!(u8::from_power_of_2_digits_asc(4, [1u64; 100].iter().cloned()).is_none());
163/// assert!(u8::from_power_of_2_digits_asc(1, [2u64].iter().cloned()).is_none());
164/// ```
165///
166/// # from_power_of_2_digits_desc
167/// ```
168/// use malachite_base::num::conversion::traits::PowerOf2Digits;
169///
170/// assert_eq!(
171///     u8::from_power_of_2_digits_desc(6, [0u64, 0, 0].iter().cloned()),
172///     Some(0)
173/// );
174/// assert_eq!(
175///     u16::from_power_of_2_digits_desc(6, [0u64, 2].iter().cloned()),
176///     Some(2)
177/// );
178/// assert_eq!(
179///     u32::from_power_of_2_digits_desc(3, [1u16, 7, 3].iter().cloned()),
180///     Some(123)
181/// );
182///
183/// assert!(u8::from_power_of_2_digits_desc(4, [1u64; 100].iter().cloned()).is_none());
184/// assert!(u8::from_power_of_2_digits_desc(1, [2u64].iter().cloned()).is_none());
185/// ```
186pub mod power_of_2_digits;