File: bitcmp.sci

package info (click to toggle)
scilab 5.2.2-9
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 334,832 kB
  • ctags: 52,586
  • sloc: xml: 526,945; ansic: 223,590; fortran: 163,080; java: 56,934; cpp: 33,840; tcl: 27,936; sh: 20,397; makefile: 9,908; ml: 9,451; perl: 1,323; cs: 614; lisp: 30
file content (133 lines) | stat: -rw-r--r-- 3,500 bytes parent folder | download | duplicates (2)
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
// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
// Copyright (C) ???? - INRIA - Farid BELAHCENE
// Copyright (C) 2008 - INRIA - Pierre MARECHAL
// 
// This file must be used under the terms of the CeCILL.
// This source file is licensed as described in the file COPYING, which
// you should have received as part of this distribution.  The terms
// are also available at
// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt

function y = bitcmp(x,n)
	
	// BITCMP function
	//
	// Given an unsigned integer x, this function returns the unsigned integer
	// which is the integer corresponding to the complementary of the binary
	// form of x
	//
	// If the bits number of the x binary representation is less than the
	// bitmax number (8,16 or 32) then the bits '1' are added to the
	// complementary in order to have bitmax number (8, 16 or 32) for the
	// complementary
	//
	// for example for the type uint8 (bitmax=8), the complementary of '1101' is not '0010' but '11110010'
	// The integer n sets the bits max number
	// -Inputs :
	//  x : an unsigned integer
	//  n : a positive integer between 1 and the bitmax of the x type
	//
	// -Output :
	//  y : an unsigned integer
	//
	// P. Marechal, 5 Feb 2008
	//   - Add argument check
	
	// Check input arguments
	// =========================================================================
	
	rhs = argn(2);
	
	// check number input argument
	
	rhs = argn(2);
	if (type(x) == 1) & (rhs == 1) then
		error(msprintf(gettext("%s: Wrong number of input argument(s): %d expected.\n"),"bitcmp",2));
	elseif rhs == 0 then
		error(msprintf(gettext("%s: Wrong number of input argument(s): At least %d expected.\n"),"bitcmp",1));
	end
	
	// check type
	
	if    (type(x)==1  & (x-floor(x)<>0 | x<0)) ..
		| (type(x)==8  & (inttype(x)<10)) ..
		| (type(x)<>1  & type(x)<>8) then
		
		error(msprintf(gettext("%s: Wrong input argument #%d: Scalar/matrix of unsigned integers expected.\n"),"bitcmp",1));
	end
	
	if  (rhs == 2) & ( ..
			(type(n)==1  & (n-floor(n)<>0 | x<0)) ..
			| (type(n)==8  & (inttype(n)<10)) ..
			| (type(n)<>1  & type(n)<>8) ..
			| (size(n,"*")<>1) ) then
		
		error(msprintf(gettext("%s: Wrong input argument #%d: An unsigned integer expected.\n"),"bitcmp",2));
	end
	
	// check n value
	
	if rhs>1 then
		
		select inttype(x)
			case 0  then nmax = 52;
			case 11 then nmax = 8;
			case 12 then nmax = 16;
			case 14 then nmax = 32;
		end
		
		if (n>nmax) | (n<1) then
			error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be between %d and %d.\n"),"bitcmp",2,1,nmax));
		end
		
	else
		n = nmax;
	end
	
	// Algorithm
	// =========================================================================
	
	// empty matrix shortcut
	
	if isempty(x) then
		y = [];
		return;
	end
	
	// unit8, uint16 and uint32 shortcut
	
	if type(x)==8 then
		y = ~x;
		if rhs > 1 then
			select inttype(x)
				case 11 then y = y & uint8(  2^n - 1);
				case 12 then y = y & uint16( 2^n - 1);
				case 14 then y = y & uint32( 2^n - 1);
			end
		end
		return;
	end
	
	n = ones(x)*n;
	
	if type(x) == 1 then
		
		a     = 2^32;
		
		y_LSB = uint32( x - double(uint32(x/a)) * a ); // LSB Less Significant Bits
		y_MSB = uint32( x/a );                         // MSB Most Significant Bits
		
		y_LSB = ~y_LSB;
		y_MSB = ~y_MSB;
		
		if n <= 32 then
			y_LSB = y_LSB & uint32( 2^n - 1);
			y_MSB = uint32(0);
		else
			y_MSB = y_MSB & uint32( 2^(n-32) - 1);
		end
		
		y = double( a * y_MSB + y_LSB );
	end
	
endfunction