Mercurial > hg > octave-nkf
annotate scripts/general/bitcmp.m @ 20509:c5a8eff5a05d
gallery: add very basic tests (check output size) for all matrix types.
author | Carnë Draug <carandraug@octave.org> |
---|---|
date | Fri, 03 Jul 2015 16:53:08 +0100 |
parents | 7503499a252b |
children | 4bb41929286b |
rev | line source |
---|---|
19898
4197fc428c7d
maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents:
19444
diff
changeset
|
1 ## Copyright (C) 2004-2015 David Bateman |
4916 | 2 ## |
7016 | 3 ## This file is part of Octave. |
4916 | 4 ## |
7016 | 5 ## Octave is free software; you can redistribute it and/or modify it |
6 ## under the terms of the GNU General Public License as published by | |
7 ## the Free Software Foundation; either version 3 of the License, or (at | |
8 ## your option) any later version. | |
9 ## | |
10 ## Octave is distributed in the hope that it will be useful, but | |
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 ## General Public License for more details. | |
4916 | 14 ## |
15 ## You should have received a copy of the GNU General Public License | |
7016 | 16 ## along with Octave; see the file COPYING. If not, see |
17 ## <http://www.gnu.org/licenses/>. | |
4916 | 18 |
19 ## -*- texinfo -*- | |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
20 ## @deftypefn {Function File} {} bitcmp (@var{A}, @var{k}) |
20368
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19898
diff
changeset
|
21 ## Return the @var{k}-bit complement of integers in @var{A}. |
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19898
diff
changeset
|
22 ## |
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19898
diff
changeset
|
23 ## If @var{k} is omitted @code{k = log2 (bitmax) + 1} is assumed. |
4916 | 24 ## |
25 ## @example | |
9051
1bf0ce0930be
Grammar check TexInfo in all .m files
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
26 ## @group |
14327
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
27 ## bitcmp (7,4) |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
28 ## @result{} 8 |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
29 ## dec2bin (11) |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
30 ## @result{} 1011 |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
31 ## dec2bin (bitcmp (11, 6)) |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
32 ## @result{} 110100 |
9051
1bf0ce0930be
Grammar check TexInfo in all .m files
Rik <rdrider0-list@yahoo.com>
parents:
8920
diff
changeset
|
33 ## @end group |
4916 | 34 ## @end example |
19444
79d4783a9978
bitcmp: fix bitwise complement for signed integers.
Carnë Draug <carandraug@octave.org>
parents:
17744
diff
changeset
|
35 ## |
5642 | 36 ## @seealso{bitand, bitor, bitxor, bitset, bitget, bitcmp, bitshift, bitmax} |
5053 | 37 ## @end deftypefn |
4916 | 38 |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
39 ## Liberally based on the version by Kai Habel from octave-forge |
4916 | 40 |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
41 function C = bitcmp (A, k) |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
42 |
4916 | 43 if (nargin < 1 || nargin > 2) |
6046 | 44 print_usage (); |
4916 | 45 endif |
46 | |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
47 if (nargin == 2 && (! isscalar (k) || (floor (k) != k))) |
11472
1740012184f9
Use uppercase for variable names in error() strings to match Info documentation. Only m-files done.
Rik <octave@nomad.inbox5.com>
parents:
11469
diff
changeset
|
48 error ("bitcmp: K must be a scalar integer"); |
6515 | 49 endif |
50 | |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
51 if (isa (A, "double")) |
6515 | 52 bmax = bitmax; |
7333 | 53 amax = ceil (log2 (bmax)); |
17392
e09cd91168d1
Support arguments of class single in bit manipulation functions (bug #34502)
Mike Miller <mtmiller@ieee.org>
parents:
14363
diff
changeset
|
54 elseif (isa (A, "single")) |
e09cd91168d1
Support arguments of class single in bit manipulation functions (bug #34502)
Mike Miller <mtmiller@ieee.org>
parents:
14363
diff
changeset
|
55 bmax = bitmax ("single"); |
e09cd91168d1
Support arguments of class single in bit manipulation functions (bug #34502)
Mike Miller <mtmiller@ieee.org>
parents:
14363
diff
changeset
|
56 amax = ceil (log2 (bmax)); |
19444
79d4783a9978
bitcmp: fix bitwise complement for signed integers.
Carnë Draug <carandraug@octave.org>
parents:
17744
diff
changeset
|
57 elseif (isinteger (A)) |
79d4783a9978
bitcmp: fix bitwise complement for signed integers.
Carnë Draug <carandraug@octave.org>
parents:
17744
diff
changeset
|
58 amax = sizeof (ones (1, class (A))) * 8; |
79d4783a9978
bitcmp: fix bitwise complement for signed integers.
Carnë Draug <carandraug@octave.org>
parents:
17744
diff
changeset
|
59 bmax = bitpack (true (amax, 1), class (A)); |
4916 | 60 else |
19444
79d4783a9978
bitcmp: fix bitwise complement for signed integers.
Carnë Draug <carandraug@octave.org>
parents:
17744
diff
changeset
|
61 error ("bitcmp: invalid class %s", class (A)); |
4916 | 62 endif |
63 | |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
64 if (nargin == 1 || k == amax) |
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
65 C = bitxor (A, bmax); |
6515 | 66 else |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
67 m = double (k); |
6515 | 68 if (any (m < 1) || any (m > amax)) |
12480
139f993936af
Uppercase variables in script error strings.
Rik <octave@nomad.inbox5.com>
parents:
11587
diff
changeset
|
69 error ("bitcmp: K must be in the range [1,%d]", amax); |
4916 | 70 endif |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
71 mask = bitshift (bmax, k - amax); |
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
72 C = bitxor (bitand (A, mask), mask); |
4916 | 73 endif |
6515 | 74 endfunction |
4916 | 75 |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
76 |
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
77 %!test |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
78 %! Amax = 53; |
6515 | 79 %! Bmax = bitmax; |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
80 %! A = bitshift (Bmax,-2); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
81 %! assert (bitcmp (A,Amax),bitor (bitshift (1,Amax-1), bitshift (1,Amax-2))); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
82 %! assert (bitcmp (A,Amax-1), bitshift (1,Amax-2)); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
83 %! assert (bitcmp (A,Amax-2), 0); |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
84 %!test |
17392
e09cd91168d1
Support arguments of class single in bit manipulation functions (bug #34502)
Mike Miller <mtmiller@ieee.org>
parents:
14363
diff
changeset
|
85 %! Amax = 24; |
e09cd91168d1
Support arguments of class single in bit manipulation functions (bug #34502)
Mike Miller <mtmiller@ieee.org>
parents:
14363
diff
changeset
|
86 %! Bmax = bitmax ("single"); |
e09cd91168d1
Support arguments of class single in bit manipulation functions (bug #34502)
Mike Miller <mtmiller@ieee.org>
parents:
14363
diff
changeset
|
87 %! A = bitshift (Bmax,-2); |
e09cd91168d1
Support arguments of class single in bit manipulation functions (bug #34502)
Mike Miller <mtmiller@ieee.org>
parents:
14363
diff
changeset
|
88 %! assert (bitcmp (A,Amax),bitor (bitshift (single (1),Amax-1), bitshift (single (1),Amax-2))); |
e09cd91168d1
Support arguments of class single in bit manipulation functions (bug #34502)
Mike Miller <mtmiller@ieee.org>
parents:
14363
diff
changeset
|
89 %! assert (bitcmp (A,Amax-1), bitshift (single (1),Amax-2)); |
e09cd91168d1
Support arguments of class single in bit manipulation functions (bug #34502)
Mike Miller <mtmiller@ieee.org>
parents:
14363
diff
changeset
|
90 %! assert (bitcmp (A,Amax-2), single (0)); |
e09cd91168d1
Support arguments of class single in bit manipulation functions (bug #34502)
Mike Miller <mtmiller@ieee.org>
parents:
14363
diff
changeset
|
91 %!test |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
92 %! Amax = 8; |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
93 %! Bmax = intmax ("uint8"); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
94 %! A = bitshift (Bmax,-2); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
95 %! assert (bitcmp (A,Amax),bitor (bitshift (uint8 (1),Amax-1), bitshift (uint8 (1),Amax-2))); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
96 %! assert (bitcmp (A,Amax-1), bitshift (uint8 (1),Amax-2)); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
97 %! assert (bitcmp (A,Amax-2), uint8 (0)); |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
98 %!test |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
99 %! Amax = 16; |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
100 %! Bmax = intmax ("uint16"); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
101 %! A = bitshift (Bmax,-2); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
102 %! assert (bitcmp (A,Amax),bitor (bitshift (uint16 (1),Amax-1), bitshift (uint16 (1),Amax-2))); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
103 %! assert (bitcmp (A,Amax-1), bitshift (uint16 (1),Amax-2)); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
104 %! assert (bitcmp (A,Amax-2), uint16 (0)); |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
105 %!test |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
106 %! Amax = 32; |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
107 %! Bmax = intmax ("uint32"); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
108 %! A = bitshift (Bmax,-2); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
109 %! assert (bitcmp (A,Amax),bitor (bitshift (uint32 (1),Amax-1), bitshift (uint32 (1),Amax-2))); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
110 %! assert (bitcmp (A,Amax-1), bitshift (uint32 (1),Amax-2)); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
111 %! assert (bitcmp (A,Amax-2), uint32 (0)); |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
112 %!test |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
113 %! Amax = 64; |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
114 %! Bmax = intmax ("uint64"); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
115 %! A = bitshift (Bmax,-2); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
116 %! assert (bitcmp (A,Amax),bitor (bitshift (uint64 (1),Amax-1), bitshift (uint64 (1),Amax-2))); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
117 %! assert (bitcmp (A,Amax-1), bitshift (uint64 (1),Amax-2)); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
118 %! assert (bitcmp (A,Amax-2), uint64 (0)); |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
119 |
19444
79d4783a9978
bitcmp: fix bitwise complement for signed integers.
Carnë Draug <carandraug@octave.org>
parents:
17744
diff
changeset
|
120 ## Do not forget signed integers |
79d4783a9978
bitcmp: fix bitwise complement for signed integers.
Carnë Draug <carandraug@octave.org>
parents:
17744
diff
changeset
|
121 %!assert (bitcmp (int8 (127)), int8 (-128)) # [1 1 1 1 1 1 1 0] |
79d4783a9978
bitcmp: fix bitwise complement for signed integers.
Carnë Draug <carandraug@octave.org>
parents:
17744
diff
changeset
|
122 %!assert (bitcmp (int8 (1)), int8 (-2)) # [1 0 0 0 0 0 0 0] |
79d4783a9978
bitcmp: fix bitwise complement for signed integers.
Carnë Draug <carandraug@octave.org>
parents:
17744
diff
changeset
|
123 %!assert (bitcmp (int8 (0)), int8 (-1)) # [0 0 0 0 0 0 0 0] |
79d4783a9978
bitcmp: fix bitwise complement for signed integers.
Carnë Draug <carandraug@octave.org>
parents:
17744
diff
changeset
|
124 %!assert (bitcmp (int8 (8)), int8 (-9)) # [0 0 0 1 0 0 0 0] |
79d4783a9978
bitcmp: fix bitwise complement for signed integers.
Carnë Draug <carandraug@octave.org>
parents:
17744
diff
changeset
|
125 |