c682b022ca199963dc6d44ebe5f3a932b00bfbcd
[scilab.git] / scilab / modules / elementary_functions / macros / dec2bin.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA - Farid BELAHCENE
3 //
4 // This file must be used under the terms of the CeCILL.
5 // This source file is licensed as described in the file COPYING, which
6 // you should have received as part of this distribution.  The terms
7 // are also available at
8 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
9
10 // =============================================================================
11 //
12 // Author : F.Belahcene
13 // DEC2BIN function
14 //
15 // Given x, a positive scalar/vector/matix of reals, this function returns
16 // a column vector of strings. Each string is the binary representation
17 // of the input argument components (i.e y(i) is the binary representation
18 // of x(i))
19 //
20 // -Inputs :
21 //    x : a  scalar/vector/matix of positives reals
22 //    n : an integer
23 // -Output :
24 //    y : a vector of strings (positives)
25 //
26 // =============================================================================
27
28 function y=dec2bin(x,n)
29         
30         rhs = argn(2);
31         
32         // check the number of input arguments
33         if (rhs<1 | rhs>2) then
34                 error(msprintf(gettext("%s: Wrong number of input argument(s): %d or %d expected.\n"),"dec2bin",1,2));
35         end
36         
37         // check type and size of the input arguments
38         if or(type(x)<>8) & (or(type(x)<>1) | or(x<0)) then
39                 error(msprintf(gettext("%s: Wrong value for input argument #%d: Scalar/vector/matrix of positive integers expected.\n"),"dec2bin",1));
40         end
41         
42         if rhs==2 & ((type(n)<>8 & (type(n)<>1 | n<0)) | prod(size(n))<>1) then
43                 error(msprintf(gettext("%s: Wrong value for input argument #%d: A positive integer expected"),"dec2bin",2));
44         end
45         
46         // empty matrix
47         if x==[]
48                 y=string([]);
49                 return;
50         end
51         
52         [nr,nc] = size(x);
53         x=x(:);
54         
55         // input argument is a scalar/vector/matrix of zeros
56         
57         if and(x==0)
58                 if rhs==2
59                         y = strcat(string(zeros(1:n))) + emptystr(nr,nc);
60                 else
61                         y = "0" + emptystr(nr,nc);
62                 end
63                 return
64         end
65         
66         // for x=25, pow=[4 3 0], because x=2^4+2^3+2^0
67         // for x=23, pow=[4 2 1 0] because x=2^4+2^2+2^1+2^0
68         // for x=[25 23]
69         // pow=[4 3 0 -1
70         //      4 2 1 0];
71         
72         while find(x>0)<>[]
73                 pow(x>0,$+1) = floor(log2(double(x(x>0))));
74                 pow(x<=0,$)  = -1;
75                 x(x>0)       = floor(x(x>0)-2^pow(x>0,$));
76         end
77         
78         pow   = pow+1;
79         ytemp = zeros(size(pow,1),size(pow,2));
80         
81         for i=1:size(ytemp,1)
82                 ind          = pow(i,pow(i,:)>=1);
83                 ytemp(i,ind) = 1;
84         end
85         
86         if rhs==2
87                 for i=1:size(ytemp,1)
88                         y(i)=strcat(string([zeros(1,round(n-size(ytemp,2))) ytemp(i,size(ytemp,2):-1:1)]));
89                 end
90         else
91                 for i=1:size(ytemp,1)
92                         y(i)=strcat(string(ytemp(i,size(ytemp,2):-1:1)));
93                 end
94         end
95         
96         y = matrix(y,nr,nc);
97         
98 endfunction