File: static_log2.html

package info (click to toggle)
boost 1.33.1-10
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 100,948 kB
  • ctags: 145,103
  • sloc: cpp: 573,492; xml: 49,055; python: 15,626; ansic: 13,588; sh: 2,099; yacc: 858; makefile: 660; perl: 427; lex: 111; csh: 6
file content (215 lines) | stat: -rw-r--r-- 4,942 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">

<html>

<head>

<title>Binary Logarithm Template</title>

</head>



<body bgcolor="white" text="black">

<h1><img src="../../../boost.png" alt="boost.png (6897 bytes)"
align="middle" width="277" height="86">Binary Logarithm Template</h1>


<p>The class template in <cite><a href="../../../boost/integer/static_log2.hpp">&lt;boost/integer/static_log2.hpp&gt;</a></cite> determines the position of the highest bit in a given value.  This facility is useful for solving generic programming problems.</p>



<h2><a name="contents">Contents</a></h2>


<ul>

	<li><a href="#contents">Contents</a></li>

	<li><a href="#synopsis">Synopsis</a></li>

	<li><a href="#usage">Usage</a></li>

	<li><a href="#example">Example</a></li>

	<li><a href="#demo">Demonstration Program</a></li>

	<li><a href="#rationale">Rationale</a></li>

	<li><a href="#credits">Credits</a></li>

	<li><a href="#whatsnew"><b>What's new</b></a></li>

</ul>



<h2><a name="synopsis">Synopsis</a></h2>



<blockquote><pre>

namespace boost
{

  typedef <em>implementation-defined</em> static_log2_argument_type;
  typedef <em>implementation-defined</em> static_log2_result_type;

  template &lt; static_log2_argument_type arg &gt;
  struct static_log2
  {
    static const static_log2_result_type value = <em>implementation-defined</em>;
  };


  template &lt; &gt;
  struct static_log2&lt; 0 &gt;
  {
    // The logarithm of zero is undefined.
  };


}  // namespace boost

</pre></blockquote>




<h2><a name="usage">Usage</a></h2>



<p>The <code>boost::static_log2</code> class template takes one template
parameter, a value of type <code>static_log2_argument_type</code>. The template
only defines one member, <code>value</code>, which gives the truncated
base-two logarithm of the template argument.</p>

<p>Since the logarithm of zero, for any base, is undefined, there is a
specialization of <code>static_log2</code> for a template argument
of zero.  This specialization has no members, so an attempt to use
the base-two logarithm of zero results in a compile-time error.</p>

<p>Note: <ul>

         <li><code>static_log2_argument_type</code> is an <i>unsigned integer
         type</i> (C++ standard, 3.9.1p3).</li>

         <li><code>static_log2_result_type</code> is an <i>integer type</i>
                 (C++ standard, 3.9.1p7).</li>

                 </ul>



<h2><a name="example">Example</a></h2>



<blockquote><pre>

#include "boost/integer/static_log2.hpp"


template &lt; boost::static_log2_argument_type value &gt;
bool is_it_what()
{
    typedef boost::static_log2&lt;value&gt;  lb_type;

    int  temp = lb_type::value;
    //...
    return (temp % 2) != 0;
}

//...

int main()
{
    bool  temp = is_it_what&lt;2000&gt;();
    //...
# if 0
    temp = is_it_what&lt;0&gt;();  // would give an error
# endif
    //...
    temp = is_it_what&lt;24&gt;();
    //...
}

</pre></blockquote>



<h2><a name="demo">Demonstration Program</a></h2>



<p>The program <a href="../test/static_log2_test.cpp">static_log2_test.cpp</a>
is a simplistic demonstration of the results from instantiating various
examples of the binary logarithm class template.</p>



<h2><a name="rationale">Rationale</a></h2>



<p>The base-two (binary) logarithm, abbreviated <dfn>lb</dfn>, function
is occasionally used to give order-estimates of computer algorithms.
The truncated logarithm can be considered the highest power-of-two in a
value, which corresponds to the value's highest set bit (for binary
integers).  Sometimes the highest-bit position could be used in generic
programming, which requires the position to be statically (<i>i.e.</i>
at compile-time) available.</p>



<h2><a name="whatsnew">Changes from previous versions:</a></h2>



<ul>
<li><i>New in version 1.32.0:</i><br><br>

The argument type and the result type of <code>boost::static_log2</code>
are now typedef'd. Formerly, they were hardcoded as <code>unsigned long</code>
and <code>int</code> respectively. Please, use the provided typedefs in new
code (and update old code as soon as possible).
</li>
</ul>



<h2><a name="credits">Credits</a></h2>



<p>The original version of the Boost binary logarithm class template was
written by <a href="../../../people/daryle_walker.html">Daryle Walker</a>
and then enhanced by Giovanni Bajo with support for compilers without
partial template specialization. The current version was suggested,
together with a reference implementation, by Vesa Karvonen. Gennaro Prota
wrote the actual source file.
</p>

<hr>



<p>Revised July 19, 2004</p>

          <p>&copy; Copyright Daryle Walker 2001.<br>
             &copy; Copyright Gennaro Prota 2004.</p>

     Distributed under the Boost Software License, Version 1.0.
        (See accompanying file LICENSE_1_0.txt or copy at
         <a href="http://www.boost.org/LICENSE_1_0.txt">
            http://www.boost.org/LICENSE_1_0.txt</a>)

<br>

</body>

</html>