mirror of
https://github.com/BorysLevytskyi/BitwiseCmd.git
synced 2025-12-10 06:52:05 +01:00
Start working on own bitwise calculation engine
This commit is contained in:
@@ -2,6 +2,7 @@ import calc from './calc';
|
|||||||
import { BitwiseOperationExpression, ScalarExpression, OperatorExpression } from '../expression/expression';
|
import { BitwiseOperationExpression, ScalarExpression, OperatorExpression } from '../expression/expression';
|
||||||
import exp from 'constants';
|
import exp from 'constants';
|
||||||
import { INT_MAX_VALUE } from './const';
|
import { INT_MAX_VALUE } from './const';
|
||||||
|
import formatter from './formatter';
|
||||||
|
|
||||||
describe("calc", () => {
|
describe("calc", () => {
|
||||||
it('calculates number of bits', () => {
|
it('calculates number of bits', () => {
|
||||||
@@ -30,4 +31,42 @@ describe("calc", () => {
|
|||||||
|
|
||||||
expect(result).toBe(3);
|
expect(result).toBe(3);
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("binary ", () => {
|
||||||
|
|
||||||
|
|
||||||
|
it("bitwise NOT same as in node", () => {
|
||||||
|
|
||||||
|
for(var i = -100; i<100;i++) {
|
||||||
|
const expected = bin(~i);
|
||||||
|
const actual = calc.bitwise.not(bin(i));
|
||||||
|
expect(`${i} is ${actual}`).toBe(`${i} is ${(expected)}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it("bitwise OR same as in node", () => {
|
||||||
|
for(var x = -100; x<100;x++) {
|
||||||
|
const y = 5+3%x+x%6*(-x);
|
||||||
|
const expected = bin(x | y);
|
||||||
|
const actual = calc.bitwise.or(bin(x), bin(y));
|
||||||
|
|
||||||
|
expect(`${x} is ${actual}`).toBe(`${x} is ${(expected)}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it("bitwise AND same as in node", () => {
|
||||||
|
for(var x = -100; x<100;x++) {
|
||||||
|
const y = 5+3%x+x%6*(-x);
|
||||||
|
const expected = bin(x & y);
|
||||||
|
const actual = calc.bitwise.and(bin(x), bin(y));
|
||||||
|
|
||||||
|
expect(`${x} is ${actual}`).toBe(`${x} is ${(expected)}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function bin(i: number) {
|
||||||
|
return (i >= 0 ? i : i >>> 0).toString(2).padStart(32, i<0 ? '1' : '0');
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
|
import { dblClick } from "@testing-library/user-event/dist/click";
|
||||||
import { ExpressionInput } from "../expression/expression-interfaces";
|
import { ExpressionInput } from "../expression/expression-interfaces";
|
||||||
import { INT_MAX_VALUE } from "./const";
|
import { INT_MAX_VALUE } from "./const";
|
||||||
|
import { start } from "repl";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
numberOfBitsDisplayed: function (num: number) : number {
|
numberOfBitsDisplayed: function (num: number) : number {
|
||||||
@@ -23,5 +25,47 @@ export default {
|
|||||||
|
|
||||||
calcExpression: function (expr: ExpressionInput) {
|
calcExpression: function (expr: ExpressionInput) {
|
||||||
return eval(expr.expressionString);
|
return eval(expr.expressionString);
|
||||||
|
},
|
||||||
|
|
||||||
|
bitwise: {
|
||||||
|
not: (bin: string) : string => {
|
||||||
|
|
||||||
|
var padded = bin
|
||||||
|
.split('').map(c => flip(c))
|
||||||
|
.join("");
|
||||||
|
|
||||||
|
return padded;
|
||||||
|
},
|
||||||
|
or: (bin1: string, bin2 : string) : string => {
|
||||||
|
|
||||||
|
const result = [];
|
||||||
|
for(var i=0; i<bin1.length; i++) {
|
||||||
|
|
||||||
|
const b1 = bin1[i] === "1";
|
||||||
|
const b2 = bin2[i] === "1";
|
||||||
|
|
||||||
|
result.push(b1 || b2 ? "1" : "0");
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.join('');
|
||||||
|
},
|
||||||
|
and: (bin1: string, bin2 : string) : string => {
|
||||||
|
|
||||||
|
const result = [];
|
||||||
|
for(var i=0; i<bin1.length; i++) {
|
||||||
|
|
||||||
|
const b1 = bin1[i] === "1";
|
||||||
|
const b2 = bin2[i] === "1";
|
||||||
|
|
||||||
|
result.push(b1 && b2 ? "1" : "0");
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.join('');
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function flip(bit:string) {
|
||||||
|
return bit === "0" ? "1" : "0";
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user