mirror of
https://github.com/BorysLevytskyi/BitwiseCmd.git
synced 2025-12-10 06:52:05 +01:00
Merge branch 'master' of https://github.com/BorysLevytskyi/BitwiseCmd
# Conflicts: # package.json
This commit is contained in:
@@ -26,7 +26,7 @@
|
|||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "react-scripts start",
|
"start": "react-scripts start",
|
||||||
"build": "react-scripts build",
|
"build": "react-scripts build & npx http-server ./build -p 3030",
|
||||||
"release": "react-scripts build & gh-pages -d build --message Release",
|
"release": "react-scripts build & gh-pages -d build --message Release",
|
||||||
"test": "react-scripts test",
|
"test": "react-scripts test",
|
||||||
"eject": "react-scripts eject",
|
"eject": "react-scripts eject",
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
import calc from './calc';
|
import calc from './calc';
|
||||||
import { BitwiseOperationExpression, NumericOperand, ExpressionOperand } from '../expression/expression';
|
import { BitwiseOperationExpression, NumericOperand, ExpressionOperand } from '../expression/expression';
|
||||||
|
import exp from 'constants';
|
||||||
|
|
||||||
describe("calc", () => {
|
describe("calc", () => {
|
||||||
it('calculates number of bits', () => {
|
it('calculates number of bits', () => {
|
||||||
expect(calc.numberOfBits(1)).toBe(1);
|
expect(calc.numberOfBits(1)).toBe(1);
|
||||||
expect(calc.numberOfBits(2)).toBe(2);
|
expect(calc.numberOfBits(2)).toBe(2);
|
||||||
expect(calc.numberOfBits(3)).toBe(2);
|
expect(calc.numberOfBits(3)).toBe(2);
|
||||||
|
expect(calc.numberOfBits(68719476735)).toBe(36);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('calculates max number of bits', () => {
|
it('calculates max number of bits', () => {
|
||||||
|
|||||||
@@ -7,6 +7,14 @@ describe("formatter", () => {
|
|||||||
expect(formatter.formatString(15, "bin")).toBe("1111");
|
expect(formatter.formatString(15, "bin")).toBe("1111");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('formats large binary number correctly', () => {
|
||||||
|
var decimal = 68719476735;
|
||||||
|
var binary = formatter.bin(68719476735);
|
||||||
|
var hex = formatter.formatString(decimal, 'hex');
|
||||||
|
expect(binary).toBe('111111111111111111111111111111111111');
|
||||||
|
expect(hex).toBe('fffffffff');
|
||||||
|
})
|
||||||
|
|
||||||
it('pads left', () => {
|
it('pads left', () => {
|
||||||
expect(formatter.padLeft("1", 3, " ")).toBe(" 1");
|
expect(formatter.padLeft("1", 3, " ")).toBe(" 1");
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import NumericOperand from './NumericOperand';
|
import NumericOperand, { INT_MAX_VALUE } from './NumericOperand';
|
||||||
|
|
||||||
it('parsed from string', () => {
|
it('parsed from string', () => {
|
||||||
var op = NumericOperand.parse('123');
|
var op = NumericOperand.parse('123');
|
||||||
@@ -10,4 +10,17 @@ it('can get other kind', () => {
|
|||||||
var op = new NumericOperand(10, 'dec');
|
var op = new NumericOperand(10, 'dec');
|
||||||
expect(op.getOtherBase('hex')).toBe('dec');
|
expect(op.getOtherBase('hex')).toBe('dec');
|
||||||
expect(op.getOtherBase('bin')).toBe('hex');
|
expect(op.getOtherBase('bin')).toBe('hex');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('negtive value binary string', () => {
|
||||||
|
expect(NumericOperand.toBaseString(-1, 'bin')).toBe('11111111111111111111111111111111');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('64 bit operand binary string', () => {
|
||||||
|
expect(NumericOperand.toBaseString(68719476735, 'bin')).toBe('111111111111111111111111111111111111');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws on negative 64 bit numbers', () => {
|
||||||
|
var bigN = -(INT_MAX_VALUE+1);
|
||||||
|
expect(() => new NumericOperand(bigN)).toThrowError("BitwiseCmd currently doesn't support 64 bit negative numbers such as " + bigN);
|
||||||
|
})
|
||||||
@@ -3,6 +3,10 @@ import { ExpressionInputItem, NumberBase } from './expression-interfaces';
|
|||||||
|
|
||||||
var globalId : number = 1;
|
var globalId : number = 1;
|
||||||
|
|
||||||
|
const INT_MAX_VALUE = 2147483647;
|
||||||
|
|
||||||
|
export {INT_MAX_VALUE};
|
||||||
|
|
||||||
// Represents numeric value
|
// Represents numeric value
|
||||||
export default class NumericOperand implements ExpressionInputItem {
|
export default class NumericOperand implements ExpressionInputItem {
|
||||||
id: number;
|
id: number;
|
||||||
@@ -17,6 +21,9 @@ export default class NumericOperand implements ExpressionInputItem {
|
|||||||
this.base = base || "dec";
|
this.base = base || "dec";
|
||||||
this.lengthInBits = NumericOperand.getBitLength(this.value);
|
this.lengthInBits = NumericOperand.getBitLength(this.value);
|
||||||
this.isExpression = false;
|
this.isExpression = false;
|
||||||
|
|
||||||
|
if(value < 0 && !NumericOperand.is32Bit(value))
|
||||||
|
throw new Error("BitwiseCmd currently doesn't support 64 bit negative numbers such as " + value);
|
||||||
}
|
}
|
||||||
|
|
||||||
getLengthInBits() {
|
getLengthInBits() {
|
||||||
@@ -102,7 +109,10 @@ export default class NumericOperand implements ExpressionInputItem {
|
|||||||
var hexVal = Math.abs(value).toString(16);
|
var hexVal = Math.abs(value).toString(16);
|
||||||
return value >= 0 ? '0x' + hexVal : '-0x' + hexVal;
|
return value >= 0 ? '0x' + hexVal : '-0x' + hexVal;
|
||||||
case 'bin':
|
case 'bin':
|
||||||
return (value>>>0).toString(2);
|
// >>> 0 is used to get an actual bit representation of the negative numbers
|
||||||
|
// https://stackoverflow.com/questions/5747123/strange-javascript-operator-expr-0
|
||||||
|
const is32Bit = NumericOperand.is32Bit(value);
|
||||||
|
return (is32Bit && value < 0 ? (value >>> 0) : value).toString(2);
|
||||||
case 'dec':
|
case 'dec':
|
||||||
return value.toString(10);
|
return value.toString(10);
|
||||||
default:
|
default:
|
||||||
@@ -113,4 +123,8 @@ export default class NumericOperand implements ExpressionInputItem {
|
|||||||
static toHexString (hex : string) {
|
static toHexString (hex : string) {
|
||||||
return hex.indexOf('-') === 0 ? '-0x' + hex.substr(1) : '0x' + hex;
|
return hex.indexOf('-') === 0 ? '-0x' + hex.substr(1) : '0x' + hex;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static is32Bit(n: number) {
|
||||||
|
return Math.abs(n) <= INT_MAX_VALUE
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -85,8 +85,9 @@ class ExpressionRow extends React.Component<ExpressionRowProps> {
|
|||||||
</tr>;;
|
</tr>;;
|
||||||
}
|
}
|
||||||
|
|
||||||
getBinaryString() : string {
|
getBinaryString() : string {
|
||||||
return this.props.expressionItem.evaluate().toBinaryString();
|
var binary = this.props.expressionItem.evaluate().toBinaryString();
|
||||||
|
return binary;
|
||||||
}
|
}
|
||||||
|
|
||||||
getLabel(): string {
|
getLabel(): string {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import log from 'loglevel';
|
import log from 'loglevel';
|
||||||
|
|
||||||
const APP_VERSION = 7;
|
const APP_VERSION = 8;
|
||||||
|
|
||||||
export type PersistedAppData = {
|
export type PersistedAppData = {
|
||||||
emphasizeBytes: boolean;
|
emphasizeBytes: boolean;
|
||||||
|
|||||||
@@ -6,6 +6,12 @@ function WhatsnewResultView() {
|
|||||||
|
|
||||||
return <div className="changelog">
|
return <div className="changelog">
|
||||||
<h3>Changelog</h3>
|
<h3>Changelog</h3>
|
||||||
|
<div className='item item-new'>
|
||||||
|
<p>
|
||||||
|
<span className="soft date">Jul 24th, 2021</span> <br/>
|
||||||
|
Fixed <a href="https://github.com/BorysLevytskyi/BitwiseCmd/issues/13">bug</a> with incorrect binary representation of 64 bit numbers. <u>Negative 64 bit numbers currently are not supported by BitwiseCmd</u>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
<div className="item item-new">
|
<div className="item item-new">
|
||||||
<p><span className="soft date">Jul 24th, 2021</span> <br/>
|
<p><span className="soft date">Jul 24th, 2021</span> <br/>
|
||||||
<ul>
|
<ul>
|
||||||
|
|||||||
@@ -1,26 +1,26 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "es5",
|
"target": "es5",
|
||||||
"lib": [
|
"lib": [
|
||||||
"dom",
|
"dom",
|
||||||
"dom.iterable",
|
"dom.iterable",
|
||||||
"esnext"
|
"esnext"
|
||||||
],
|
],
|
||||||
"allowJs": true,
|
"allowJs": true,
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"esModuleInterop": true,
|
"esModuleInterop": true,
|
||||||
"allowSyntheticDefaultImports": true,
|
"allowSyntheticDefaultImports": true,
|
||||||
"strict": true,
|
"strict": true,
|
||||||
"forceConsistentCasingInFileNames": true,
|
"forceConsistentCasingInFileNames": true,
|
||||||
"noFallthroughCasesInSwitch": true,
|
"noFallthroughCasesInSwitch": true,
|
||||||
"module": "esnext",
|
"module": "esnext",
|
||||||
"moduleResolution": "node",
|
"moduleResolution": "node",
|
||||||
"resolveJsonModule": true,
|
"resolveJsonModule": true,
|
||||||
"isolatedModules": true,
|
"isolatedModules": true,
|
||||||
"noEmit": true,
|
"noEmit": true,
|
||||||
"jsx": "react-jsx"
|
"jsx": "preserve"
|
||||||
},
|
},
|
||||||
"include": [
|
"include": [
|
||||||
"src"
|
"src"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user