-
Notifications
You must be signed in to change notification settings - Fork 2
/
bits.html
172 lines (164 loc) · 11.1 KB
/
bits.html
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
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Setting and reading individual bit of a integer — bits v0.8 documentation</title>
<link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '0.8',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="bits v0.8 documentation" href="index.html" />
<link rel="next" title="Bash tricks with find and sed" href="sed.html" />
<link rel="prev" title="Suppressing duplicates in a list" href="dup.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="sed.html" title="Bash tricks with find and sed"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="dup.html" title="Suppressing duplicates in a list"
accesskey="P">previous</a> |</li>
<li><a href="index.html">bits v0.8 documentation</a> »</li>
</ul>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h4>Previous topic</h4>
<p class="topless"><a href="dup.html"
title="previous chapter">Suppressing duplicates in a list</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="sed.html"
title="next chapter">Bash tricks with <em>find</em> and <em>sed</em></a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/bits.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" size="18" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="setting-and-reading-individual-bit-of-a-integer">
<h1>Setting and reading individual bit of a integer<a class="headerlink" href="#setting-and-reading-individual-bit-of-a-integer" title="Permalink to this headline">¶</a></h1>
<p>The decimal number 42 is written 101010 in base 2.</p>
<p>Say, you want to check wether the third bit of 42 is 1 or 0 (counting
from zero, this is bit number 2), you can use:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">bit_number</span> <span class="o">=</span> <span class="mi">2</span>
<span class="gp">>>> </span><span class="n">number</span> <span class="o">=</span> <span class="mi">42</span>
<span class="gp">>>> </span><span class="p">(</span><span class="n">number</span> <span class="o">>></span> <span class="n">bit_number</span><span class="p">)</span> <span class="o">&</span> <span class="mi">1</span>
<span class="go">0</span>
</pre></div>
</div>
<p>Ok, the third bit is zero, now you want to set that bit to one,
leaving the other ones untouched:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">number</span> <span class="o">=</span> <span class="n">number</span> <span class="o">|</span> <span class="p">(</span><span class="mi">1</span> <span class="o"><<</span> <span class="n">bit_number</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">number</span>
<span class="go">46</span>
</pre></div>
</div>
<p>All good: 46 is written 101110 in base 2, the third bit has been
correctly set. Now to set it back to 0, it is</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">number</span> <span class="o">=</span> <span class="n">number</span> <span class="o">&</span> <span class="o">~</span><span class="p">(</span><span class="mi">1</span> <span class="o"><<</span> <span class="n">bit_number</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">number</span>
<span class="go">42</span>
</pre></div>
</div>
<p>Tricky isn’t it? you can hide the bit operators behind functions:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="n">get_bit</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">num</span><span class="p">,</span> <span class="n">n</span><span class="p">:</span> <span class="p">(</span><span class="n">num</span> <span class="o">>></span> <span class="n">n</span><span class="p">)</span> <span class="o">&</span> <span class="mi">1</span>
<span class="gp">>>> </span><span class="n">set_zero</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">num</span><span class="p">,</span> <span class="n">n</span><span class="p">:</span> <span class="n">num</span> <span class="o">&</span> <span class="o">~</span><span class="p">(</span><span class="mi">1</span> <span class="o"><<</span> <span class="n">n</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">set_one</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">num</span><span class="p">,</span> <span class="n">n</span><span class="p">:</span> <span class="n">num</span> <span class="o">|</span> <span class="p">(</span><span class="mi">1</span> <span class="o"><<</span> <span class="n">n</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">get_bit</span><span class="p">(</span><span class="mi">42</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span>
<span class="go">0</span>
<span class="gp">>>> </span><span class="n">set_one</span><span class="p">(</span><span class="mi">42</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span>
<span class="go">46</span>
<span class="gp">>>> </span><span class="n">set_zero</span><span class="p">(</span><span class="mi">46</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span>
<span class="go">43</span>
</pre></div>
</div>
<p>Here are two functions to convert to and from base 2:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="k">def</span> <span class="nf">bin2dec</span><span class="p">(</span><span class="n">binary</span><span class="p">):</span>
<span class="gp">... </span> <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">binary</span><span class="p">),</span><span class="mi">2</span><span class="p">)</span>
<span class="gp">...</span>
<span class="gp">>>> </span><span class="n">bin2dec</span><span class="p">(</span><span class="mi">101010</span><span class="p">)</span>
<span class="go">42</span>
<span class="gp">>>> </span><span class="k">def</span> <span class="nf">dec2bin</span><span class="p">(</span><span class="n">decimal</span><span class="p">):</span>
<span class="gp">... </span> <span class="n">digits</span> <span class="o">=</span> <span class="p">[]</span>
<span class="gp">... </span> <span class="k">while</span> <span class="n">decimal</span><span class="o">></span><span class="mi">0</span><span class="p">:</span>
<span class="gp">... </span> <span class="n">decimal</span><span class="p">,</span> <span class="n">digit</span> <span class="o">=</span> <span class="n">decimal</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">decimal</span><span class="o">%</span><span class="mi">2</span>
<span class="gp">... </span> <span class="n">digits</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">digit</span><span class="p">))</span>
<span class="gp">... </span> <span class="k">return</span> <span class="s">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">digits</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="gp">>>> </span><span class="n">dec2bin</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
<span class="go">'101010'</span>
<span class="gp">>>> </span><span class="n">bin2dec</span><span class="p">(</span><span class="n">dec2bin</span><span class="p">(</span><span class="mi">42</span><span class="p">))</span>
<span class="go">42</span>
<span class="gp">>>> </span><span class="n">dec2bin</span><span class="p">(</span><span class="n">bin2dec</span><span class="p">(</span><span class="mi">101010</span><span class="p">))</span>
<span class="go">'101010'</span>
<span class="go">>>></span>
</pre></div>
</div>
<p>This article has more details: <a class="reference internal" href="bitfield.html"><em>Manipulating bitfields in Python (in most language actually)</em></a>.</p>
</div>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="sed.html" title="Bash tricks with find and sed"
>next</a> |</li>
<li class="right" >
<a href="dup.html" title="Suppressing duplicates in a list"
>previous</a> |</li>
<li><a href="index.html">bits v0.8 documentation</a> »</li>
</ul>
</div>
<div class="footer">
© Copyright 2009, Jean Daniel Browne.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.4.
</div>
</body>
</html>