13af6ab5fSopenharmony_ci/*
23af6ab5fSopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License.
53af6ab5fSopenharmony_ci * You may obtain a copy of the License at
63af6ab5fSopenharmony_ci *
73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
83af6ab5fSopenharmony_ci *
93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and
133af6ab5fSopenharmony_ci * limitations under the License.
143af6ab5fSopenharmony_ci */
153af6ab5fSopenharmony_ci
163af6ab5fSopenharmony_cifunction And(a: double, b: double): long {
173af6ab5fSopenharmony_ci    return a & b
183af6ab5fSopenharmony_ci}
193af6ab5fSopenharmony_ci
203af6ab5fSopenharmony_cifunction Or(a: double, b: double): long {
213af6ab5fSopenharmony_ci    return a | b
223af6ab5fSopenharmony_ci}
233af6ab5fSopenharmony_ci
243af6ab5fSopenharmony_cifunction Xor(a: double, b: double): long {
253af6ab5fSopenharmony_ci    return a ^ b
263af6ab5fSopenharmony_ci}
273af6ab5fSopenharmony_ci
283af6ab5fSopenharmony_cifunction LeftShift(a: double, b: double): long {
293af6ab5fSopenharmony_ci    return a << b
303af6ab5fSopenharmony_ci}
313af6ab5fSopenharmony_ci
323af6ab5fSopenharmony_cifunction RightShift(a: double, b: double): long {
333af6ab5fSopenharmony_ci    return a >> b
343af6ab5fSopenharmony_ci}
353af6ab5fSopenharmony_ci
363af6ab5fSopenharmony_cifunction UnsignedRightShift(a: double, b: double): long {
373af6ab5fSopenharmony_ci    return a >>> b
383af6ab5fSopenharmony_ci}
393af6ab5fSopenharmony_ci 
403af6ab5fSopenharmony_cifunction Inversion(a: double): long {
413af6ab5fSopenharmony_ci    return ~a;
423af6ab5fSopenharmony_ci}
433af6ab5fSopenharmony_ci
443af6ab5fSopenharmony_cifunction main(): void {
453af6ab5fSopenharmony_ci    /* ---- Compile time tests ---- */
463af6ab5fSopenharmony_ci
473af6ab5fSopenharmony_ci    // Testing "and" operator:
483af6ab5fSopenharmony_ci    assert (542.910991 & -1903.2040221) == 16
493af6ab5fSopenharmony_ci    assert (-542.910991 & 1903.2040221) == 1378
503af6ab5fSopenharmony_ci    assert (-542.910991 & -1903.2040221) == -1920
513af6ab5fSopenharmony_ci    assert (9E120 & 56.75) == 56
523af6ab5fSopenharmony_ci    assert (0.0 & 0.0) == 0
533af6ab5fSopenharmony_ci    assert (NaN & 42.131330352) == 0
543af6ab5fSopenharmony_ci    assert (-NaN & -23432.34110144432) == 0
553af6ab5fSopenharmony_ci    assert (Infinity & -94.24445985981884) == 9223372036854775714
563af6ab5fSopenharmony_ci    assert (-Infinity & 94.24445985981884) == 0
573af6ab5fSopenharmony_ci
583af6ab5fSopenharmony_ci    // Testing "or" operator: 
593af6ab5fSopenharmony_ci    assert (542.910991 | 1903.2040221) == 1919
603af6ab5fSopenharmony_ci    assert (542.910991 | -1903.2040221) == -1377
613af6ab5fSopenharmony_ci    assert (-542.910991 | 1903.2040221) == -17
623af6ab5fSopenharmony_ci    assert (-542.910991 | -1903.2040221) == -525
633af6ab5fSopenharmony_ci    assert (9E120 | 0) == 9223372036854775807
643af6ab5fSopenharmony_ci    assert (824E3 | 21.018763) == 824021
653af6ab5fSopenharmony_ci    assert (1.0 | 0.1) == 1
663af6ab5fSopenharmony_ci    assert (NaN | 0.2) == 0
673af6ab5fSopenharmony_ci    assert (-NaN | 0.3) == 0
683af6ab5fSopenharmony_ci    assert (Infinity | 0.4) == 9223372036854775807
693af6ab5fSopenharmony_ci    assert (-Infinity | 0.5) == -9223372036854775808
703af6ab5fSopenharmony_ci
713af6ab5fSopenharmony_ci    // Testing "xor" operator: 
723af6ab5fSopenharmony_ci    assert (542.910991 ^ 1903.2040221) == 1393
733af6ab5fSopenharmony_ci    assert (542.910991 ^ -1903.2040221) == -1393
743af6ab5fSopenharmony_ci    assert (-542.910991 ^ 1903.2040221) == -1395
753af6ab5fSopenharmony_ci    assert (-542.910991 ^ -1903.2040221) == 1395
763af6ab5fSopenharmony_ci    assert (49509.2348100001 ^ 49509.2348100001) == 0
773af6ab5fSopenharmony_ci    assert (9E120 ^ 1.2) == 9223372036854775806
783af6ab5fSopenharmony_ci    assert (824E3 ^ 21.018763) == 824021
793af6ab5fSopenharmony_ci    assert (NaN ^ 99854258.24) == 99854258
803af6ab5fSopenharmony_ci    assert (-NaN ^ 30483040.293244) == 30483040
813af6ab5fSopenharmony_ci    assert (Infinity ^ 1.2) == 9223372036854775806
823af6ab5fSopenharmony_ci    assert (-Infinity ^ 10049329.80001) == -9223372036844726479
833af6ab5fSopenharmony_ci
843af6ab5fSopenharmony_ci    // Testing "left shift" operator:
853af6ab5fSopenharmony_ci    assert (1E-100 << 0.0) == 0
863af6ab5fSopenharmony_ci    assert (0.00003 << 12.13) == 0
873af6ab5fSopenharmony_ci    assert (42.109 << 0.0120939) == 42
883af6ab5fSopenharmony_ci    assert (1.409240940 << 17.3) == 131072
893af6ab5fSopenharmony_ci    assert (4342435.309421 << 3.1) == 34739480
903af6ab5fSopenharmony_ci    assert (9010034745.3449093132 << 7.000000000001) == 1153284447360
913af6ab5fSopenharmony_ci    assert (-423.14981 << 20.32) == -443547648
923af6ab5fSopenharmony_ci    assert (500.13 << 128.3440) == 500
933af6ab5fSopenharmony_ci    assert (500.45 << 121.10000002) == -1729382256910270464
943af6ab5fSopenharmony_ci    assert (NaN << 330.3911) == 0
953af6ab5fSopenharmony_ci    assert (-NaN << 12.91213) == 0
963af6ab5fSopenharmony_ci    assert (Infinity << 1.0092) == -2
973af6ab5fSopenharmony_ci    assert (-Infinity << 1.0092) == 0
983af6ab5fSopenharmony_ci    assert (-52242.2301 << -8.7) == -1297036692682702848
993af6ab5fSopenharmony_ci    assert (52242.2301 << -8.7) == 1297036692682702848
1003af6ab5fSopenharmony_ci
1013af6ab5fSopenharmony_ci    // Testing "right shift" operator:
1023af6ab5fSopenharmony_ci    assert (1E-100 >> 0.0) == 0
1033af6ab5fSopenharmony_ci    assert (0.00003 >> 12.13) == 0
1043af6ab5fSopenharmony_ci    assert (42.109 >> 0.0120939) == 42
1053af6ab5fSopenharmony_ci    assert (1.409240940 >> 17.3) == 0
1063af6ab5fSopenharmony_ci    assert (4342435.309421 >> 3.1) == 542804
1073af6ab5fSopenharmony_ci    assert (9010034.3449093132 >> 3.000000000001) == 1126254
1083af6ab5fSopenharmony_ci    assert (-4599090490.24 >> 11) == -2245650
1093af6ab5fSopenharmony_ci    assert (500.13 >> 128.3440) == 500
1103af6ab5fSopenharmony_ci    assert (500.45 >> 121.10000002) == 0
1113af6ab5fSopenharmony_ci    assert (NaN >> 11.000003) == 0
1123af6ab5fSopenharmony_ci    assert (-NaN >> 7.912130001) == 0
1133af6ab5fSopenharmony_ci    assert (Infinity >> 61) == 3
1143af6ab5fSopenharmony_ci    assert (-Infinity >> 61) == -4
1153af6ab5fSopenharmony_ci    assert (132090941883.34343 >> -32.2) == 30
1163af6ab5fSopenharmony_ci    assert (-132090941883.34343 >> -32.2) == -31
1173af6ab5fSopenharmony_ci
1183af6ab5fSopenharmony_ci    // Testing "unsigned right shift" operator:
1193af6ab5fSopenharmony_ci    assert (1E-100 >>> 0.0) == 0
1203af6ab5fSopenharmony_ci    assert (0.00003 >>> 12.13) == 0
1213af6ab5fSopenharmony_ci    assert (42.109 >>> 0.0120939) == 42
1223af6ab5fSopenharmony_ci    assert (1.409240940 >>> 17.3) == 0
1233af6ab5fSopenharmony_ci    assert (4342435.309421 >>> 3.1) == 542804
1243af6ab5fSopenharmony_ci    assert (9010034.3449093132 >>> 3.000000000001) == 1126254
1253af6ab5fSopenharmony_ci    assert (-4599090490.24 >>> 11) == 9007199252495342
1263af6ab5fSopenharmony_ci    assert (500.13 >>> 128.3440) == 500
1273af6ab5fSopenharmony_ci    assert (500.45 >>> 121.10000002) == 0
1283af6ab5fSopenharmony_ci    assert (NaN >>> 11.000003) == 0
1293af6ab5fSopenharmony_ci    assert (-NaN >>> 7.912130001) == 0
1303af6ab5fSopenharmony_ci    assert (Infinity >>> 61.8) == 3
1313af6ab5fSopenharmony_ci    assert (-Infinity >>> 61.8) == 4
1323af6ab5fSopenharmony_ci    assert (132090941883.34343 >>> -32.2) == 30
1333af6ab5fSopenharmony_ci    assert (-132090941883.34343 >>> -32.2) == 4294967265
1343af6ab5fSopenharmony_ci
1353af6ab5fSopenharmony_ci    // Testing "bitwise complement" operator
1363af6ab5fSopenharmony_ci    assert ~0 == -1
1373af6ab5fSopenharmony_ci    assert ~0.000034 == -1
1383af6ab5fSopenharmony_ci    assert ~39530.93 == -39531
1393af6ab5fSopenharmony_ci    assert ~93718001.5424230894 == -93718002
1403af6ab5fSopenharmony_ci    assert ~Infinity == -9223372036854775808
1413af6ab5fSopenharmony_ci    assert ~-Infinity == 9223372036854775807
1423af6ab5fSopenharmony_ci    assert ~NaN == -1   
1433af6ab5fSopenharmony_ci    assert ~-NaN == -1
1443af6ab5fSopenharmony_ci    assert ~1E210 == -9223372036854775808
1453af6ab5fSopenharmony_ci    assert ~-1E210 ==  9223372036854775807
1463af6ab5fSopenharmony_ci    assert ~56E5 == -5600001
1473af6ab5fSopenharmony_ci    assert ~-56E5 == 5599999
1483af6ab5fSopenharmony_ci
1493af6ab5fSopenharmony_ci    /* ---- Run time tests ---- */
1503af6ab5fSopenharmony_ci
1513af6ab5fSopenharmony_ci    // Testing "and" operator:
1523af6ab5fSopenharmony_ci    assert And(542.910991, -1903.2040221) == 16
1533af6ab5fSopenharmony_ci    assert And(-542.910991, 1903.2040221) == 1378
1543af6ab5fSopenharmony_ci    assert And(-542.910991, -1903.2040221) == -1920
1553af6ab5fSopenharmony_ci    assert And(9E120, 56.75) == 56
1563af6ab5fSopenharmony_ci    assert And(0.0, 0.0) == 0
1573af6ab5fSopenharmony_ci    assert And(NaN, 42.131330352) == 0
1583af6ab5fSopenharmony_ci    assert And(-NaN, -23432.34110144432) == 0
1593af6ab5fSopenharmony_ci    assert And(Infinity, -94.24445985981884) == 9223372036854775714
1603af6ab5fSopenharmony_ci    assert And(-Infinity, 94.24445985981884) == 0
1613af6ab5fSopenharmony_ci
1623af6ab5fSopenharmony_ci    // Testing "or" operator: 
1633af6ab5fSopenharmony_ci    assert Or(542.910991, 1903.2040221) == 1919
1643af6ab5fSopenharmony_ci    assert Or(542.910991, -1903.2040221) == -1377
1653af6ab5fSopenharmony_ci    assert Or(-542.910991, 1903.2040221) == -17
1663af6ab5fSopenharmony_ci    assert Or(-542.910991, -1903.2040221) == -525
1673af6ab5fSopenharmony_ci    assert Or(9E120, 0) == 9223372036854775807
1683af6ab5fSopenharmony_ci    assert Or(824E3, 21.018763) == 824021
1693af6ab5fSopenharmony_ci    assert Or(1.0, 0.1) == 1
1703af6ab5fSopenharmony_ci    assert Or(NaN, 0.2) == 0
1713af6ab5fSopenharmony_ci    assert Or(-NaN, 0.3) == 0
1723af6ab5fSopenharmony_ci    assert Or(Infinity, 0.4) == 9223372036854775807
1733af6ab5fSopenharmony_ci    assert Or(-Infinity, 0.5) == -9223372036854775808
1743af6ab5fSopenharmony_ci
1753af6ab5fSopenharmony_ci    // Testing "xor" operator: 
1763af6ab5fSopenharmony_ci    assert Xor(542.910991, 1903.2040221) == 1393
1773af6ab5fSopenharmony_ci    assert Xor(542.910991, -1903.2040221) == -1393
1783af6ab5fSopenharmony_ci    assert Xor(-542.910991, 1903.2040221) == -1395
1793af6ab5fSopenharmony_ci    assert Xor(-542.910991, -1903.2040221) == 1395
1803af6ab5fSopenharmony_ci    assert Xor(49509.2348100001, 49509.2348100001) == 0
1813af6ab5fSopenharmony_ci    assert Xor(9E120, 1.2) == 9223372036854775806
1823af6ab5fSopenharmony_ci    assert Xor(824E3, 21.018763) == 824021
1833af6ab5fSopenharmony_ci    assert Xor(NaN, 99854258.24) == 99854258
1843af6ab5fSopenharmony_ci    assert Xor(-NaN, 30483040.293244) == 30483040
1853af6ab5fSopenharmony_ci    assert Xor(Infinity, 1.2) == 9223372036854775806
1863af6ab5fSopenharmony_ci    assert Xor(-Infinity, 10049329.80001) == -9223372036844726479
1873af6ab5fSopenharmony_ci
1883af6ab5fSopenharmony_ci    // Testing "left shift" operator:
1893af6ab5fSopenharmony_ci    assert LeftShift(1E-100, 0.0) == 0
1903af6ab5fSopenharmony_ci    assert LeftShift(0.00003, 12.13) == 0
1913af6ab5fSopenharmony_ci    assert LeftShift(42.109, 0.0120939) == 42
1923af6ab5fSopenharmony_ci    assert LeftShift(1.409240940, 17.3) == 131072
1933af6ab5fSopenharmony_ci    assert LeftShift(4342435.309421, 3.1) == 34739480
1943af6ab5fSopenharmony_ci    assert LeftShift(9010034745.3449093132, 7.000000000001) == 1153284447360
1953af6ab5fSopenharmony_ci    assert LeftShift(-423.14981, 20.32) == -443547648
1963af6ab5fSopenharmony_ci    assert LeftShift(500.13, 128.3440) == 500
1973af6ab5fSopenharmony_ci    assert LeftShift(500.45, 121.10000002) == -1729382256910270464
1983af6ab5fSopenharmony_ci    assert LeftShift(NaN, 330.3911) == 0
1993af6ab5fSopenharmony_ci    assert LeftShift(-NaN, 12.91213) == 0
2003af6ab5fSopenharmony_ci    assert LeftShift(Infinity, 1.0092) == -2
2013af6ab5fSopenharmony_ci    assert LeftShift(-Infinity, 1.0092) == 0
2023af6ab5fSopenharmony_ci    assert LeftShift(-52242.2301, -8.7) == -1297036692682702848
2033af6ab5fSopenharmony_ci    assert LeftShift(52242.2301,-8.7) == 1297036692682702848
2043af6ab5fSopenharmony_ci
2053af6ab5fSopenharmony_ci    // Testing "right shift" operator:
2063af6ab5fSopenharmony_ci    assert RightShift(1E-100, 0.0) == 0
2073af6ab5fSopenharmony_ci    assert RightShift(0.00003, 12.13) == 0
2083af6ab5fSopenharmony_ci    assert RightShift(42.109, 0.0120939) == 42
2093af6ab5fSopenharmony_ci    assert RightShift(1.409240940, 17.3) == 0
2103af6ab5fSopenharmony_ci    assert RightShift(4342435.309421, 3.1) == 542804
2113af6ab5fSopenharmony_ci    assert RightShift(9010034.3449093132, 3.000000000001) == 1126254
2123af6ab5fSopenharmony_ci    assert RightShift(-4599090490.24, 11) == -2245650
2133af6ab5fSopenharmony_ci    assert RightShift(500.13, 128.3440) == 500
2143af6ab5fSopenharmony_ci    assert RightShift(500.45, 121.10000002) == 0
2153af6ab5fSopenharmony_ci    assert RightShift(NaN, 11.000003) == 0
2163af6ab5fSopenharmony_ci    assert RightShift(-NaN, 7.912130001) == 0
2173af6ab5fSopenharmony_ci    assert RightShift(Infinity, 61) == 3
2183af6ab5fSopenharmony_ci    assert RightShift(-Infinity, 61) == -4
2193af6ab5fSopenharmony_ci    assert RightShift(132090941883.34343, -32.2) == 30
2203af6ab5fSopenharmony_ci    assert RightShift(-132090941883.34343, -32.2) == -31
2213af6ab5fSopenharmony_ci
2223af6ab5fSopenharmony_ci    // Testing "unsigned right shift" operator:
2233af6ab5fSopenharmony_ci    assert UnsignedRightShift(1E-100, 0.0) == 0
2243af6ab5fSopenharmony_ci    assert UnsignedRightShift(0.00003,12.13) == 0
2253af6ab5fSopenharmony_ci    assert UnsignedRightShift(42.109, 0.0120939) == 42
2263af6ab5fSopenharmony_ci    assert UnsignedRightShift(1.409240940, 17.3) == 0
2273af6ab5fSopenharmony_ci    assert UnsignedRightShift(4342435.309421, 3.1) == 542804
2283af6ab5fSopenharmony_ci    assert UnsignedRightShift(9010034.3449093132, 3.000000000001) == 1126254
2293af6ab5fSopenharmony_ci    assert UnsignedRightShift(-4599090490.24, 11) == 9007199252495342
2303af6ab5fSopenharmony_ci    assert UnsignedRightShift(500.13, 128.3440) == 500
2313af6ab5fSopenharmony_ci    assert UnsignedRightShift(500.45, 121.10000002) == 0
2323af6ab5fSopenharmony_ci    assert UnsignedRightShift(NaN, 11.000003) == 0
2333af6ab5fSopenharmony_ci    assert UnsignedRightShift(-NaN, 7.912130001) == 0
2343af6ab5fSopenharmony_ci    assert UnsignedRightShift(Infinity, 61.8) == 3
2353af6ab5fSopenharmony_ci    assert UnsignedRightShift(-Infinity, 61.8) == 4
2363af6ab5fSopenharmony_ci    assert UnsignedRightShift(132090941883.34343, -32.2) == 30
2373af6ab5fSopenharmony_ci    assert UnsignedRightShift(-132090941883.34343, -32.2) == 4294967265
2383af6ab5fSopenharmony_ci 
2393af6ab5fSopenharmony_ci    // Testing "bitwise complement" operator
2403af6ab5fSopenharmony_ci    assert Inversion(0) == -1
2413af6ab5fSopenharmony_ci    assert Inversion(0.000034) == -1
2423af6ab5fSopenharmony_ci    assert Inversion(39530.93) == -39531
2433af6ab5fSopenharmony_ci    assert Inversion(93718001.5424230894) == -93718002
2443af6ab5fSopenharmony_ci    assert Inversion(Infinity) == -9223372036854775808
2453af6ab5fSopenharmony_ci    assert Inversion(-Infinity) == 9223372036854775807
2463af6ab5fSopenharmony_ci    assert Inversion(NaN) == -1   
2473af6ab5fSopenharmony_ci    assert Inversion(-NaN) == -1
2483af6ab5fSopenharmony_ci    assert Inversion(1E210) == -9223372036854775808
2493af6ab5fSopenharmony_ci    assert Inversion(-1E210) ==  9223372036854775807
2503af6ab5fSopenharmony_ci    assert Inversion(56E5) == -5600001
2513af6ab5fSopenharmony_ci    assert Inversion(-56E5) == 5599999
2523af6ab5fSopenharmony_ci}
253