1/* The contents of this file are subject to the Netscape Public 2 * License Version 1.1 (the "License"); you may not use this file 3 * except in compliance with the License. You may obtain a copy of 4 * the License at http://www.mozilla.org/NPL/ 5 * 6 * Software distributed under the License is distributed on an "AS 7 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or 8 * implied. See the License for the specific language governing 9 * rights and limitations under the License. 10 * 11 * The Original Code is Mozilla Communicator client code, released March 12 * 31, 1998. 13 * 14 * The Initial Developer of the Original Code is Netscape Communications 15 * Corporation. Portions created by Netscape are 16 * Copyright (C) 1998 Netscape Communications Corporation. All 17 * Rights Reserved. 18 * 19 * Contributor(s): 20 * 21 */ 22/** 23 File Name: 11.10-2.js 24 ECMA Section: 11.10-2 Binary Bitwise Operators: | 25 Description: 26 Semantics 27 28 The production A : A @ B, where @ is one of the bitwise operators in the 29 productions &, ^, | , is evaluated as follows: 30 31 1. Evaluate A. 32 2. Call GetValue(Result(1)). 33 3. Evaluate B. 34 4. Call GetValue(Result(3)). 35 5. Call ToInt32(Result(2)). 36 6. Call ToInt32(Result(4)). 37 7. Apply the bitwise operator @ to Result(5) and Result(6). The result is 38 a signed 32 bit integer. 39 8. Return Result(7). 40 41 Author: christine@netscape.com 42 Date: 12 november 1997 43*/ 44 var SECTION = "11.10-2"; 45 var VERSION = "ECMA_1"; 46 startTest(); 47 48 var testcases = getTestCases(); 49 50 writeHeaderToLog( SECTION + " Binary Bitwise Operators: |"); 51 test(); 52 53function test() { 54 for ( tc=0; tc < testcases.length; tc++ ) { 55 testcases[tc].passed = writeTestCaseResult( 56 testcases[tc].expect, 57 testcases[tc].actual, 58 testcases[tc].description +" = "+ 59 testcases[tc].actual ); 60 61 testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value "; 62 } 63 stopTest(); 64 return ( testcases ); 65} 66function getTestCases() { 67 var array = new Array(); 68 var item = 0; 69 var shiftexp = 0; 70 var addexp = 0; 71 72 for ( shiftpow = 0; shiftpow < 33; shiftpow++ ) { 73 shiftexp += Math.pow( 2, shiftpow ); 74 75 for ( addpow = 0; addpow < 33; addpow++ ) { 76 addexp += Math.pow(2, addpow); 77 78 array[item++] = new TestCase( SECTION, 79 shiftexp + " | " + addexp, 80 Or( shiftexp, addexp ), 81 shiftexp | addexp ); 82 } 83 } 84 85 return ( array ); 86} 87function ToInteger( n ) { 88 n = Number( n ); 89 var sign = ( n < 0 ) ? -1 : 1; 90 91 if ( n != n ) { 92 return 0; 93 } 94 if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY ) { 95 return n; 96 } 97 return ( sign * Math.floor(Math.abs(n)) ); 98} 99function ToInt32( n ) { 100 n = Number( n ); 101 var sign = ( n < 0 ) ? -1 : 1; 102 103 if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY) { 104 return 0; 105 } 106 107 n = (sign * Math.floor( Math.abs(n) )) % Math.pow(2,32); 108 n = ( n >= Math.pow(2,31) ) ? n - Math.pow(2,32) : n; 109 110 return ( n ); 111} 112function ToUint32( n ) { 113 n = Number( n ); 114 var sign = ( n < 0 ) ? -1 : 1; 115 116 if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY) { 117 return 0; 118 } 119 n = sign * Math.floor( Math.abs(n) ) 120 121 n = n % Math.pow(2,32); 122 123 if ( n < 0 ){ 124 n += Math.pow(2,32); 125 } 126 127 return ( n ); 128} 129function ToUint16( n ) { 130 var sign = ( n < 0 ) ? -1 : 1; 131 132 if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY) { 133 return 0; 134 } 135 136 n = ( sign * Math.floor( Math.abs(n) ) ) % Math.pow(2,16); 137 138 if (n <0) { 139 n += Math.pow(2,16); 140 } 141 142 return ( n ); 143} 144function Mask( b, n ) { 145 b = ToUint32BitString( b ); 146 b = b.substring( b.length - n ); 147 b = ToUint32Decimal( b ); 148 return ( b ); 149} 150function ToUint32BitString( n ) { 151 var b = ""; 152 for ( p = 31; p >=0; p-- ) { 153 if ( n >= Math.pow(2,p) ) { 154 b += "1"; 155 n -= Math.pow(2,p); 156 } else { 157 b += "0"; 158 } 159 } 160 return b; 161} 162function ToInt32BitString( n ) { 163 var b = ""; 164 var sign = ( n < 0 ) ? -1 : 1; 165 166 b += ( sign == 1 ) ? "0" : "1"; 167 168 for ( p = 30; p >=0; p-- ) { 169 if ( (sign == 1 ) ? sign * n >= Math.pow(2,p) : sign * n > Math.pow(2,p) ) { 170 b += ( sign == 1 ) ? "1" : "0"; 171 n -= sign * Math.pow( 2, p ); 172 } else { 173 b += ( sign == 1 ) ? "0" : "1"; 174 } 175 } 176 177 return b; 178} 179function ToInt32Decimal( bin ) { 180 var r = 0; 181 var sign; 182 183 if ( Number(bin.charAt(0)) == 0 ) { 184 sign = 1; 185 r = 0; 186 } else { 187 sign = -1; 188 r = -(Math.pow(2,31)); 189 } 190 191 for ( var j = 0; j < 31; j++ ) { 192 r += Math.pow( 2, j ) * Number(bin.charAt(31-j)); 193 } 194 195 return r; 196} 197function ToUint32Decimal( bin ) { 198 var r = 0; 199 200 201 for ( l = bin.length; l < 32; l++ ) { 202 bin = "0" + bin; 203 } 204 205 for ( j = 0; j < 31; j++ ) { 206 r += Math.pow( 2, j ) * Number(bin.charAt(31-j)); 207 208 } 209 210 return r; 211} 212function And( s, a ) { 213 s = ToInt32( s ); 214 a = ToInt32( a ); 215 216 var bs = ToInt32BitString( s ); 217 var ba = ToInt32BitString( a ); 218 219 var result = ""; 220 221 for ( var bit = 0; bit < bs.length; bit++ ) { 222 if ( bs.charAt(bit) == "1" && ba.charAt(bit) == "1" ) { 223 result += "1"; 224 } else { 225 result += "0"; 226 } 227 } 228 return ToInt32Decimal(result); 229} 230function Xor( s, a ) { 231 s = ToInt32( s ); 232 a = ToInt32( a ); 233 234 var bs = ToInt32BitString( s ); 235 var ba = ToInt32BitString( a ); 236 237 var result = ""; 238 239 for ( var bit = 0; bit < bs.length; bit++ ) { 240 if ( (bs.charAt(bit) == "1" && ba.charAt(bit) == "0") || 241 (bs.charAt(bit) == "0" && ba.charAt(bit) == "1") 242 ) { 243 result += "1"; 244 } else { 245 result += "0"; 246 } 247 } 248 249 return ToInt32Decimal(result); 250} 251function Or( s, a ) { 252 s = ToInt32( s ); 253 a = ToInt32( a ); 254 255 var bs = ToInt32BitString( s ); 256 var ba = ToInt32BitString( a ); 257 258 var result = ""; 259 260 for ( var bit = 0; bit < bs.length; bit++ ) { 261 if ( bs.charAt(bit) == "1" || ba.charAt(bit) == "1" ) { 262 result += "1"; 263 } else { 264 result += "0"; 265 } 266 } 267 268 return ToInt32Decimal(result); 269} 270