ba9269a4c6ce67a05fea32e6af06aaa2fa7c6417
[scilab.git] / scilab / modules / elementary_functions / help / ru_RU / bitwise / bitcmp.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!--
3  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
4  * Copyright (C) 2020 - Samuel GOUGEON
5  *
6  * This file is hereby licensed under the terms of the GNU GPL v2.0,
7  * pursuant to article 5.3.4 of the CeCILL v.2.1.
8  * This file was originally licensed under the terms of the CeCILL v2.1,
9  * and continues to be available under such terms.
10  * For more information, see the COPYING file which you should have received
11  * along with this program.
12  *
13  -->
14 <refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
15       xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns3="http://www.w3.org/1999/xhtml"
16       xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook"
17       xmlns:scilab="http://www.scilab.org" xml:id="bitcmp" xml:lang="ru">
18     <refnamediv>
19         <refname>bitcmp</refname>
20         <refpurpose>побитовое дополнение целых чисел</refpurpose>
21     </refnamediv>
22     <refsynopsisdiv>
23         <title>Синтаксис</title>
24         <synopsis>
25             y = bitcmp(x)
26             y = bitcmp(x, bitnum)
27         </synopsis>
28     </refsynopsisdiv>
29     <refsection>
30         <title>Аргументы</title>
31         <variablelist>
32             <varlistentry>
33                 <term>x, y</term>
34                 <listitem>
35                     массивы знаковых и беззнаковых целых чисел (int8, .., uint64)
36                     или положительных десятичных целых чисел. Поддерживаются гиперматрицы.
37                     <varname>x</varname> и <varname>y</varname> одного типа целого
38                     числа и одинакового размера.
39                     <para/>
40                 </listitem>
41             </varlistentry>
42             <varlistentry>
43                 <term>bitnum</term>
44                 <listitem>
45                     положительное кодированное иди десятичное целое число или массив
46                     положительных кодированных или десятичных целых чисел размером,
47                     равным size(x): учитываются и инвертируются биты от №1 до №bitnum
48                     в <varname>x</varname>. В соответствии с типом целого числа
49                     <varname>x</varname>, <varname>bitnum</varname> должен быть в
50                     интервале <literal>[1, bitmax]</literal>, где <literal>bitmax</literal>:
51                     <table>
52                         <tr><th>inttype :</th>
53                             <td>int8</td>
54                             <td>uint8</td>
55                             <td>int16</td>
56                             <td>uint16</td>
57                             <td>int32</td>
58                             <td>uint32</td>
59                             <td>int64</td>
60                             <td>uint64</td>
61                             <td>decimal</td>
62                         </tr>
63                         <tr><th>bitmax :</th>
64                             <td>8</td>
65                             <td>8</td>
66                             <td>16</td>
67                             <td>16</td>
68                             <td>32</td>
69                             <td>32</td>
70                             <td>64</td>
71                             <td>64</td>
72                             <td>1024</td>
73                         </tr>
74                     </table>
75                     <para/>
76                     Значение по умолчанию <varname>bitnum</varname> зависит от
77                     типа входного целого числа:
78                     <itemizedlist>
79                         <listitem>
80                             <literal>bitnum = bitmax</literal> для кодированных целых чисел
81                         </listitem>
82                         <listitem>
83                             <literal>bitnum = 53</literal> для десятичных целых чисел
84                             <literal>x ≤ 1/%eps</literal>
85                         </listitem>
86                         <listitem>
87                             <literal>bitnum = int(log2(x))+1</literal> для десятичных целых чисел
88                             <literal>x > 1/%eps</literal>.
89                         </listitem>
90                     </itemizedlist>
91                     <para/>
92                 </listitem>
93             </varlistentry>
94         </variablelist>
95     </refsection>
96     <refsection>
97         <title>Описание</title>
98         <para>
99             <literal>bitcmp(x)</literal> вычисляет двоичный дополнительный код каждого
100             элемента <varname>x</varname> и выдаёт его в соответствующем элементе
101             <varname>y</varname>.
102         </para>
103         <para>
104             В следующем описании 2^0 соответствует биту №1. Целое число, чей наивысший
105             бит №n, находится в интервале <literal>[2^(n-1), 2^n-1]</literal>.
106         </para>
107         <para>
108             Для <varname>x</varname> такого, что <literal>abs(x) ≥ 2^bitnum</literal>,
109             его биты от <literal>#(bitnum+1)</literal> до <literal>№(int(log2(x))+1)</literal>
110             игнорируются. Рассматриваются и инвертируются только его биты от
111             <literal>№1</literal> до <literal>№bitnum</literal>
112         </para>
113         <para>
114             Пример:
115             <screen>
116 --> bitget(180, 1:8)
117  ans  =
118    0.   0.   1.   0.   1.   1.   0.   1.
119 --> bitcmp(180, 4)
120  ans  =
121    11.
122 --> bitget(11, 1:8)
123  ans  =
124    1.   1.   0.   1.   0.   0.   0.   0.
125 </screen>
126         </para>
127         <para>
128             Для <varname>x</varname> такого, что <literal>abs(x) &lt; 2^bitnum</literal>,
129             биты от <literal>№(int(log2(x))+2)</literal> до <literal>№bitnum</literal>
130             дополняются нулями. Затем рассматриваются и инвертируются все биты от <literal>№1</literal> до
131             <literal>№bitnum</literal>.
132         </para>
133         <para>
134             Пример:
135             <screen>
136 --> x = 30; int(log2(30))+2
137  ans  =
138    6.
139 --> bitget(30, 1:10)
140  ans  =
141    0.   1.   1.   1.   1.   0.   0.   0.   0.   0.
142 --> bitcmp(30, 7)
143  ans  =
144    97.
145 --> bitget(97, 1:10)
146  ans  =
147    1.   0.   0.   0.   0.   1.   1.   0.   0.   0.
148 </screen>
149         </para>
150     </refsection>
151     <refsection>
152         <title>Примеры</title>
153         <programlisting role="example"><![CDATA[
154 x = uint8(13);
155 b = bitget(x, 1:8)
156 c = bitcmp(x, 8)
157 bitget(c, 1:8)
158 1 - b
159    ]]></programlisting>
160         <screen><![CDATA[
161 --> b = bitget(x, 1:8)
162  b  =
163   1  0  1  1  0  0  0  0
164
165 --> c = bitcmp(x, 8)
166  c  =
167   242
168
169 --> bitget(c, 1:8)
170  ans  =
171   0  1  0  0  1  1  1  1
172
173 --> 1 - b
174  ans  =
175   0  1  0  0  1  1  1  1
176 ]]></screen>
177         <para/>
178         <para>
179         Принимаются отрицательные кодированные целые числа:
180         </para>
181         <programlisting role="example"><![CDATA[
182 bitcmp(int8([-71 -34 -1 0 33 70]))
183 bitcmp(int8([-71 -34 -1 0 33 70]), 8)
184 bitcmp(int8([-71 -34 -1 0 33 70]), 7)
185 bitcmp(int8([-71 -34 -1 0 33 70]), 6)
186 bitcmp(int8([-71 -34 -1 0 33 70]), 5)
187 bitcmp(int8([-71 -34 -1 0 33 70]), 4)
188      ]]></programlisting>
189         <screen><![CDATA[
190 --> bitcmp(int8([-71 -34 -1 0 33 70]))
191  ans  =
192   70  33  0 -1 -34 -71
193
194 --> bitcmp(int8([-71 -34 -1 0 33 70]), 8)
195  ans  =
196   70  33  0 -1 -34 -71
197
198 --> bitcmp(int8([-71 -34 -1 0 33 70]), 7)
199  ans  =
200   70  33  0  127  94  57
201
202 --> bitcmp(int8([-71 -34 -1 0 33 70]), 6)
203  ans  =
204   6  33  0  63  30  57
205
206 --> bitcmp(int8([-71 -34 -1 0 33 70]), 5)
207  ans  =
208   6  1  0  31  30  25
209
210 --> bitcmp(int8([-71 -34 -1 0 33 70]), 4)
211  ans  =
212   6  1  0  15  14  9
213 ]]></screen>
214         <para/>
215         <para>
216             Можно работать с 64-битными большими целыми числами:
217         </para>
218         <programlisting role="example"><![CDATA[
219 b = (rand(1,62)<0.5)*1;
220 x = sum(b .* (uint64(2).^(0:61)))
221 r = bitcmp(x)
222 bg = bitget(r, 1:62);
223 [msprintf("%d ",b(:)) ; msprintf("%d ",bg(:))]
224      ]]></programlisting>
225         <screen><![CDATA[
226 --> x = sum(b .* (uint64(2).^(0:61)))
227  x  =
228   4154509482123930814
229
230 --> r = bitcmp(x)
231  r  =
232   14292234591585620801
233
234 --> bg = bitget(r, 1:62);
235 --> [msprintf("%d ",b(:)) ; msprintf("%d ",bg(:))]
236  ans  =
237   "0 1 1 1 1 1 0 1 0 0 1 1 0 1 0 0 ... 1 0 0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 0 0 1 1 1 "
238   "1 0 0 0 0 0 1 0 1 1 0 0 1 0 1 1 ... 0 1 1 1 1 0 1 1 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 "
239 ]]></screen>
240         <para/>
241         <para>
242         bitnum может быть массивом:
243         </para>
244         <programlisting role="example"><![CDATA[
245 bitcmp([0 0 0 0 0], 3:7)
246      ]]></programlisting>
247         <screen><![CDATA[
248 --> bitcmp([0 0 0 0 0], 3:7)
249  ans  =
250    7.   15.   31.   63.   127.
251 ]]></screen>
252         <para/>
253         <para>
254             bitnum может быть > 52:
255         </para>
256         <programlisting role="example"><![CDATA[
257 format(22)
258 bitcmp(2^70, 65)
259 sum(2.^(13:64))   // 52 высшие биты
260      ]]></programlisting>
261         <screen><![CDATA[
262 --> bitcmp(2^70, 65)
263  ans  =
264    36893488147419095040.
265
266 --> sum(2.^(13:64))
267  ans  =
268    36893488147419095040.
269 ]]></screen>
270         <para/>
271         <para>
272             Могут обрабатываться огромные десятичные числа:
273         </para>
274         <programlisting role="example"><![CDATA[
275 format(22)
276 log2(1e100)
277 r = bitcmp(1e100, 333)
278 bitcmp(1e100) // bitnum = int(log2(x)) + 1 is used by default
279 bitcmp(r, 333)
280      ]]></programlisting>
281         <screen><![CDATA[
282 --> log2(1e100)
283  ans  =
284    332.19280948873625903
285
286 --> r = bitcmp(1e100, 333)
287  r  =
288    7.498005798264093D+99
289
290 --> bitcmp(1e100)  // bitnum = int(log2(x)) + 1 is used by default
291  ans  =
292    7.498005798264093D+99
293
294 --> bitcmp(r, 333)
295  ans  =
296    1.00000000000000D+100
297 ]]></screen>
298     </refsection>
299     <refsection role="see also">
300         <title>Смотрите также</title>
301         <simplelist type="inline">
302             <member>
303                 <link linkend="bitxor">bitxor</link>
304             </member>
305             <member>
306                 <link linkend="bitget">bitget</link>
307             </member>
308             <member>
309                 <link linkend="minus">минус</link>
310             </member>
311         </simplelist>
312     </refsection>
313     <refsection role="history">
314         <title>История</title>
315         <revhistory>
316             <revision>
317                 <revnumber>6.1.1</revnumber>
318                 <revdescription>
319                     <itemizedlist>
320                         <listitem>
321                             Расширение до 64-битных целых чисел.
322                         </listitem>
323                         <listitem>
324                             Расширение до всех знаковых целых чисел.
325                         </listitem>
326                         <listitem>
327                             Десятичные положительные целые числа > 2^52 вплоть до
328                             2^1024 = number_properties("huge")
329                             теперь могут быть обработаны с bitnum вплоть до 1024 вместо 52.
330                         </listitem>
331                         <listitem>
332                             bitnum теперь необязательно как и входные десятичные целые числа.
333                             Оно на самом деле может быть массивом.
334                         </listitem>
335                     </itemizedlist>
336                 </revdescription>
337             </revision>
338         </revhistory>
339     </refsection>
340 </refentry>