1/* 2 * Copyright (c) 2023-2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16function And(a: double, b: double): long { 17 return a & b 18} 19 20function Or(a: double, b: double): long { 21 return a | b 22} 23 24function Xor(a: double, b: double): long { 25 return a ^ b 26} 27 28function LeftShift(a: double, b: double): long { 29 return a << b 30} 31 32function RightShift(a: double, b: double): long { 33 return a >> b 34} 35 36function UnsignedRightShift(a: double, b: double): long { 37 return a >>> b 38} 39 40function Inversion(a: double): long { 41 return ~a; 42} 43 44function main(): void { 45 /* ---- Compile time tests ---- */ 46 47 // Testing "and" operator: 48 assertEQ((542.910991 & -1903.2040221), 16) 49 assertEQ((-542.910991 & 1903.2040221), 1378) 50 assertEQ((-542.910991 & -1903.2040221), -1920) 51 assertEQ((9E120 & 56.75), 56) 52 assertEQ((0.0 & 0.0), 0) 53 assertEQ((NaN & 42.131330352), 0) 54 assertEQ((-NaN & -23432.34110144432), 0) 55 assertEQ((Infinity & -94.24445985981884), 9223372036854775714) 56 assertEQ((-Infinity & 94.24445985981884), 0) 57 58 // Testing "or" operator: 59 assertEQ((542.910991 | 1903.2040221), 1919) 60 assertEQ((542.910991 | -1903.2040221), -1377) 61 assertEQ((-542.910991 | 1903.2040221), -17) 62 assertEQ((-542.910991 | -1903.2040221), -525) 63 assertEQ((9E120 | 0), 9223372036854775807) 64 assertEQ((824E3 | 21.018763), 824021) 65 assertEQ((1.0 | 0.1), 1) 66 assertEQ((NaN | 0.2), 0) 67 assertEQ((-NaN | 0.3), 0) 68 assertEQ((Infinity | 0.4), 9223372036854775807) 69 assertEQ((-Infinity | 0.5), -9223372036854775808) 70 71 // Testing "xor" operator: 72 assertEQ((542.910991 ^ 1903.2040221), 1393) 73 assertEQ((542.910991 ^ -1903.2040221), -1393) 74 assertEQ((-542.910991 ^ 1903.2040221), -1395) 75 assertEQ((-542.910991 ^ -1903.2040221), 1395) 76 assertEQ((49509.2348100001 ^ 49509.2348100001), 0) 77 assertEQ((9E120 ^ 1.2), 9223372036854775806) 78 assertEQ((824E3 ^ 21.018763), 824021) 79 assertEQ((NaN ^ 99854258.24), 99854258) 80 assertEQ((-NaN ^ 30483040.293244), 30483040) 81 assertEQ((Infinity ^ 1.2), 9223372036854775806) 82 assertEQ((-Infinity ^ 10049329.80001), -9223372036844726479) 83 84 // Testing "left shift" operator: 85 assertEQ((1E-100 << 0.0), 0) 86 assertEQ((0.00003 << 12.13), 0) 87 assertEQ((42.109 << 0.0120939), 42) 88 assertEQ((1.409240940 << 17.3), 131072) 89 assertEQ((4342435.309421 << 3.1), 34739480) 90 assertEQ((9010034745.3449093132 << 7.000000000001), 1153284447360) 91 assertEQ((-423.14981 << 20.32), -443547648) 92 assertEQ((500.13 << 128.3440), 500) 93 assertEQ((500.45 << 121.10000002), -1729382256910270464) 94 assertEQ((NaN << 330.3911), 0) 95 assertEQ((-NaN << 12.91213), 0) 96 assertEQ((Infinity << 1.0092), -2) 97 assertEQ((-Infinity << 1.0092), 0) 98 assertEQ((-52242.2301 << -8.7), -1297036692682702848) 99 assertEQ((52242.2301 << -8.7), 1297036692682702848) 100 101 // Testing "right shift" operator: 102 assertEQ((1E-100 >> 0.0), 0) 103 assertEQ((0.00003 >> 12.13), 0) 104 assertEQ((42.109 >> 0.0120939), 42) 105 assertEQ((1.409240940 >> 17.3), 0) 106 assertEQ((4342435.309421 >> 3.1), 542804) 107 assertEQ((9010034.3449093132 >> 3.000000000001), 1126254) 108 assertEQ((-4599090490.24 >> 11), -2245650) 109 assertEQ((500.13 >> 128.3440), 500) 110 assertEQ((500.45 >> 121.10000002), 0) 111 assertEQ((NaN >> 11.000003), 0) 112 assertEQ((-NaN >> 7.912130001), 0) 113 assertEQ((Infinity >> 61), 3) 114 assertEQ((-Infinity >> 61), -4) 115 assertEQ((132090941883.34343 >> -32.2), 30) 116 assertEQ((-132090941883.34343 >> -32.2), -31) 117 118 // Testing "unsigned right shift" operator: 119 assertEQ((1E-100 >>> 0.0), 0) 120 assertEQ((0.00003 >>> 12.13), 0) 121 assertEQ((42.109 >>> 0.0120939), 42) 122 assertEQ((1.409240940 >>> 17.3), 0) 123 assertEQ((4342435.309421 >>> 3.1), 542804) 124 assertEQ((9010034.3449093132 >>> 3.000000000001), 1126254) 125 assertEQ((-4599090490.24 >>> 11), 9007199252495342) 126 assertEQ((500.13 >>> 128.3440), 500) 127 assertEQ((500.45 >>> 121.10000002), 0) 128 assertEQ((NaN >>> 11.000003), 0) 129 assertEQ((-NaN >>> 7.912130001), 0) 130 assertEQ((Infinity >>> 61.8), 3) 131 assertEQ((-Infinity >>> 61.8), 4) 132 assertEQ((132090941883.34343 >>> -32.2), 30) 133 assertEQ((-132090941883.34343 >>> -32.2), 4294967265) 134 135 // Testing "bitwise complement" operator 136 assertEQ(~0, -1) 137 assertEQ(~0.000034, -1) 138 assertEQ(~39530.93, -39531) 139 assertEQ(~93718001.5424230894, -93718002) 140 assertEQ(~Infinity, -9223372036854775808) 141 assertEQ(~-Infinity, 9223372036854775807) 142 assertEQ(~NaN, -1 ) 143 assertEQ(~-NaN, -1) 144 assertEQ(~1E210, -9223372036854775808) 145 assertEQ(~-1E210, 9223372036854775807) 146 assertEQ(~56E5, -5600001) 147 assertEQ(~-56E5, 5599999) 148 149 /* ---- Run time tests ---- */ 150 151 // Testing "and" operator: 152 assertEQ(And(542.910991, -1903.2040221), 16) 153 assertEQ(And(-542.910991, 1903.2040221), 1378) 154 assertEQ(And(-542.910991, -1903.2040221), -1920) 155 assertEQ(And(9E120, 56.75), 56) 156 assertEQ(And(0.0, 0.0), 0) 157 assertEQ(And(NaN, 42.131330352), 0) 158 assertEQ(And(-NaN, -23432.34110144432), 0) 159 assertEQ(And(Infinity, -94.24445985981884), 9223372036854775714) 160 assertEQ(And(-Infinity, 94.24445985981884), 0) 161 162 // Testing "or" operator: 163 assertEQ(Or(542.910991, 1903.2040221), 1919) 164 assertEQ(Or(542.910991, -1903.2040221), -1377) 165 assertEQ(Or(-542.910991, 1903.2040221), -17) 166 assertEQ(Or(-542.910991, -1903.2040221), -525) 167 assertEQ(Or(9E120, 0), 9223372036854775807) 168 assertEQ(Or(824E3, 21.018763), 824021) 169 assertEQ(Or(1.0, 0.1), 1) 170 assertEQ(Or(NaN, 0.2), 0) 171 assertEQ(Or(-NaN, 0.3), 0) 172 assertEQ(Or(Infinity, 0.4), 9223372036854775807) 173 assertEQ(Or(-Infinity, 0.5), -9223372036854775808) 174 175 // Testing "xor" operator: 176 assertEQ(Xor(542.910991, 1903.2040221), 1393) 177 assertEQ(Xor(542.910991, -1903.2040221), -1393) 178 assertEQ(Xor(-542.910991, 1903.2040221), -1395) 179 assertEQ(Xor(-542.910991, -1903.2040221), 1395) 180 assertEQ(Xor(49509.2348100001, 49509.2348100001), 0) 181 assertEQ(Xor(9E120, 1.2), 9223372036854775806) 182 assertEQ(Xor(824E3, 21.018763), 824021) 183 assertEQ(Xor(NaN, 99854258.24), 99854258) 184 assertEQ(Xor(-NaN, 30483040.293244), 30483040) 185 assertEQ(Xor(Infinity, 1.2), 9223372036854775806) 186 assertEQ(Xor(-Infinity, 10049329.80001), -9223372036844726479) 187 188 // Testing "left shift" operator: 189 assertEQ(LeftShift(1E-100, 0.0), 0) 190 assertEQ(LeftShift(0.00003, 12.13), 0) 191 assertEQ(LeftShift(42.109, 0.0120939), 42) 192 assertEQ(LeftShift(1.409240940, 17.3), 131072) 193 assertEQ(LeftShift(4342435.309421, 3.1), 34739480) 194 assertEQ(LeftShift(9010034745.3449093132, 7.000000000001), 1153284447360) 195 assertEQ(LeftShift(-423.14981, 20.32), -443547648) 196 assertEQ(LeftShift(500.13, 128.3440), 500) 197 assertEQ(LeftShift(500.45, 121.10000002), -1729382256910270464) 198 assertEQ(LeftShift(NaN, 330.3911), 0) 199 assertEQ(LeftShift(-NaN, 12.91213), 0) 200 assertEQ(LeftShift(Infinity, 1.0092), -2) 201 assertEQ(LeftShift(-Infinity, 1.0092), 0) 202 assertEQ(LeftShift(-52242.2301, -8.7), -1297036692682702848) 203 assertEQ(LeftShift(52242.2301,-8.7), 1297036692682702848) 204 205 // Testing "right shift" operator: 206 assertEQ(RightShift(1E-100, 0.0), 0) 207 assertEQ(RightShift(0.00003, 12.13), 0) 208 assertEQ(RightShift(42.109, 0.0120939), 42) 209 assertEQ(RightShift(1.409240940, 17.3), 0) 210 assertEQ(RightShift(4342435.309421, 3.1), 542804) 211 assertEQ(RightShift(9010034.3449093132, 3.000000000001), 1126254) 212 assertEQ(RightShift(-4599090490.24, 11), -2245650) 213 assertEQ(RightShift(500.13, 128.3440), 500) 214 assertEQ(RightShift(500.45, 121.10000002), 0) 215 assertEQ(RightShift(NaN, 11.000003), 0) 216 assertEQ(RightShift(-NaN, 7.912130001), 0) 217 assertEQ(RightShift(Infinity, 61), 3) 218 assertEQ(RightShift(-Infinity, 61), -4) 219 assertEQ(RightShift(132090941883.34343, -32.2), 30) 220 assertEQ(RightShift(-132090941883.34343, -32.2), -31) 221 222 // Testing "unsigned right shift" operator: 223 assertEQ(UnsignedRightShift(1E-100, 0.0), 0) 224 assertEQ(UnsignedRightShift(0.00003,12.13), 0) 225 assertEQ(UnsignedRightShift(42.109, 0.0120939), 42) 226 assertEQ(UnsignedRightShift(1.409240940, 17.3), 0) 227 assertEQ(UnsignedRightShift(4342435.309421, 3.1), 542804) 228 assertEQ(UnsignedRightShift(9010034.3449093132, 3.000000000001), 1126254) 229 assertEQ(UnsignedRightShift(-4599090490.24, 11), 9007199252495342) 230 assertEQ(UnsignedRightShift(500.13, 128.3440), 500) 231 assertEQ(UnsignedRightShift(500.45, 121.10000002), 0) 232 assertEQ(UnsignedRightShift(NaN, 11.000003), 0) 233 assertEQ(UnsignedRightShift(-NaN, 7.912130001), 0) 234 assertEQ(UnsignedRightShift(Infinity, 61.8), 3) 235 assertEQ(UnsignedRightShift(-Infinity, 61.8), 4) 236 assertEQ(UnsignedRightShift(132090941883.34343, -32.2), 30) 237 assertEQ(UnsignedRightShift(-132090941883.34343, -32.2), 4294967265) 238 239 // Testing "bitwise complement" operator 240 assertEQ(Inversion(0), -1) 241 assertEQ(Inversion(0.000034), -1) 242 assertEQ(Inversion(39530.93), -39531) 243 assertEQ(Inversion(93718001.5424230894), -93718002) 244 assertEQ(Inversion(Infinity), -9223372036854775808) 245 assertEQ(Inversion(-Infinity), 9223372036854775807) 246 assertEQ(Inversion(NaN), -1 ) 247 assertEQ(Inversion(-NaN), -1) 248 assertEQ(Inversion(1E210), -9223372036854775808) 249 assertEQ(Inversion(-1E210), 9223372036854775807) 250 assertEQ(Inversion(56E5), -5600001) 251 assertEQ(Inversion(-56E5), 5599999) 252} 253