www.pudn.com > communication-systems-using-MATLAB-m-files.rar > de2bi.m
function b = de2bi(varargin)
%DE2BI Convert decimal numbers to binary numbers.
% B = DE2BI(D) converts a nonnegative integer decimal vector D to a binary
% matrix B. Each row of the binary matrix B corresponds to one element of D.
% The default orientation of the of the binary output is Right-MSB; the first
% element in B represents the lowest bit.
%
% In addition to the vector input, three optional parameters can be given:
%
% B = DE2BI(...,N) uses N to define how many digits (columns) are output.
%
% B = DE2BI(...,N,P) uses P to define which base to convert the decimal
% elements to.
%
% B = DE2BI(...,FLAG) uses FLAG to determine the output orientation. FLAG
% has two possible values, 'right-msb' and 'left-msb'. Giving a 'right-msb'
% FLAG does not change the function's default behavior. Giving a 'left-msb'
% FLAG flips the output orientation to display the MSB to the left.
%
% Examples:
% » D = [12; 5];
%
% » B = de2bi(D) » B = de2bi(D,5)
% B = B =
% 0 0 1 1 0 0 1 1 0
% 1 0 1 0 1 0 1 0 0
%
% » T = de2bi(D,[],3) » B = de2bi(D,5,'left-msb')
% T = B =
% 0 1 1 0 1 1 0 0
% 2 1 0 0 0 1 0 1
%
% See also BI2DE.
% Copyright 1996-2001 The MathWorks, Inc.
% $Revision: 1.16 $ $Date: 2001/04/23 15:32:11 $
% Typical error checking.
error(nargchk(1,4,nargin));
% --- Placeholder for the signature string.
sigStr = '';
flag = '';
p = [];
n = [];
% --- Identify string and numeric arguments
for i=1:nargin
if(i>1)
sigStr(size(sigStr,2)+1) = '/';
end;
% --- Assign the string and numeric flags
if(ischar(varargin{i}))
sigStr(size(sigStr,2)+1) = 's';
elseif(isnumeric(varargin{i}))
sigStr(size(sigStr,2)+1) = 'n';
else
error('Only string and numeric arguments are accepted.');
end;
end;
% --- Identify parameter signitures and assign values to variables
switch sigStr
% --- de2bi(d)
case 'n'
d = varargin{1};
% --- de2bi(d, n)
case 'n/n'
d = varargin{1};
n = varargin{2};
% --- de2bi(d, flag)
case 'n/s'
d = varargin{1};
flag = varargin{2};
% --- de2bi(d, n, flag)
case 'n/n/s'
d = varargin{1};
n = varargin{2};
flag = varargin{3};
% --- de2bi(d, flag, n)
case 'n/s/n'
d = varargin{1};
flag = varargin{2};
n = varargin{3};
% --- de2bi(d, n, p)
case 'n/n/n'
d = varargin{1};
n = varargin{2};
p = varargin{3};
% --- de2bi(d, n, p, flag)
case 'n/n/n/s'
d = varargin{1};
n = varargin{2};
p = varargin{3};
flag = varargin{4};
% --- de2bi(d, n, flag, p)
case 'n/n/s/n'
d = varargin{1};
n = varargin{2};
flag = varargin{3};
p = varargin{4};
% --- de2bi(d, flag, n, p)
case 'n/s/n/n'
d = varargin{1};
flag = varargin{2};
n = varargin{3};
p = varargin{4};
% --- If the parameter list does not match one of these signatures.
otherwise
error('Syntax error.');
end;
if isempty(d)
error('Required parameter empty.');
end
d = d(:);
len_d = length(d);
if max(max(d < 0)) | max(max(~isfinite(d))) | (~isreal(d)) | (max(max(floor(d) ~= d)))
error('Input must contain only finite real positive integers.');
end
% Assign the base to convert to.
if isempty(p)
p = 2;
elseif max(size(p) ~= 1)
error('Destination base must be scalar.');
elseif (~isfinite(p)) | (~isreal(p)) | (floor(p) ~= p)
error('Destination base must be a finite real integer.');
elseif p < 2
error('Cannot convert to a base of less than two.');
end;
% Determine minimum length required.
tmp = max(d);
if tmp ~= 0 % Want base-p log of tmp.
ntmp = floor( log(tmp) / log(p) ) + 1;
else % Since you can't take log(0).
ntmp = 1;
end
% This takes care of any round off error that occurs for really big inputs.
if ~( (p^ntmp) > tmp )
ntmp = ntmp + 1;
end
% Assign number of columns in output matrix.
if isempty(n)
n = ntmp;
elseif max(size(n) ~= 1)
error('Specified number of columns must be scalar.');
elseif (~isfinite(n)) | (~isreal(n)) | (floor(n) ~= n)
error('Specified number of columns must be a finite real integer.');
elseif n < ntmp
error('Specified number of columns in output matrix is too small.');
end
% Check if the string flag is valid.
if isempty(flag)
flag = 'right-msb';
elseif ~(strcmp(flag, 'right-msb') | strcmp(flag, 'left-msb'))
error('Invalid string flag.');
end
% Initial value.
b = zeros(len_d, n);
% Perform conversion.
for i = 1 : len_d % Cycle through each element of the input vector/matrix.
j = 1;
tmp = d(i);
while (j <= n) & (tmp > 0) % Cycle through each digit.
b(i, j) = rem(tmp, p); % Determine current digit.
tmp = floor(tmp/p);
j = j + 1;
end;
end;
% If a flag is specified to flip the output such that the MSB is to the left.
if strcmp(flag, 'left-msb')
b2 = b;
b = b2(:,n:-1:1);
end
% [EOF] de2bi.m