Bạn có thể thêm các tham số không kiểu mẫu để "mô phỏng" thêm bit:
// Utility metafunction used by top_bit<N>.
template <unsigned long long N1, unsigned long long N2>
struct compare {
enum { value = N1 > N2 ? N1 >> 1 : compare<N1 << 1, N2>::value };
};
// This is hit when N1 grows beyond the size representable
// in an unsigned long long. It's value is never actually used.
template<unsigned long long N2>
struct compare<0, N2> {
enum { value = 42 };
};
// Determine the highest 1-bit in an integer. Returns 0 for N == 0.
template <unsigned long long N>
struct top_bit {
enum { value = compare<1, N>::value };
};
template <unsigned long long N1, unsigned long long N2 = 0>
struct binary {
enum {
value =
(top_bit<binary<N2>::value>::value << 1) * binary<N1>::value +
binary<N2>::value
};
};
template <unsigned long long N1>
struct binary<N1, 0> {
enum { value = (N1 % 10) + 2 * binary<N1/10>::value };
};
template <>
struct binary<0> {
enum { value = 0 } ;
};
Bạn có thể sử dụng như trước đây, ví dụ:
binary<1001101>::value
Nhưng bạn cũng có thể sử dụng sau các hình thức tương đương:
binary<100,1101>::value
binary<1001,101>::value
binary<100110,1>::value
Về cơ bản, tham số bổ sung cung cấp cho bạn 20 bit khác để phát. Bạn có thể thêm nhiều tham số hơn nếu cần.
Bởi vì giá trị địa điểm của số thứ hai được sử dụng để tìm ra số lượng đầu tiên cần phải di chuyển đến đâu, số thứ hai phải bắt đầu bằng 1. (Điều này là bắt buộc, kể từ khi bắt đầu bằng một 0 sẽ làm cho số được hiểu là số bát phân.)
Nguồn
2009-03-31 13:41:37
Giới hạn 20 có thể phụ thuộc vào trình biên dịch. Nó phụ thuộc vào bao nhiêu mẫu đệ quy nó sẽ chịu đựng được. Một số trình biên dịch hiện đại sẽ cho phép bạn vượt qua trong một đối số để thiết lập độ sâu đệ quy mẫu tối đa. –
Tôi mặc dù giới hạn là do số chữ số thập phân bạn có thể lưu trữ trong một unsigned long dài, vì nó về cơ bản lấy số thập phân * 101011011 và biến thành nhị phân, có? – paxdiablo
Pax: có, ít nhất là cho GCC mà tôi đang sử dụng. – Unknown