Matematicheskiye_obosnovani.../lab1/not.js
2025-01-29 16:04:11 +03:00

137 lines
3.3 KiB
JavaScript

import { S16_0, S16_1, S16_2, S16_3, S16_4, S16_5, S16_6, S16_7, S16_8, S16_9, S16_A, S16_B, S16_C, S16_D, S16_E, S16_F } from "./symbol/S16.js"
import { S8_0, S8_1, S8_2, S8_3, S8_4, S8_5, S8_6, S8_7 } from "./symbol/S8.js"
import { S2_0, S2_1 } from "./symbol/S2.js"
import { S10_0, S10_1, S10_2, S10_3, S10_4, S10_5, S10_6, S10_7, S10_8, S10_9 } from "./symbol/S10.js"
import { kBuffer, Num } from "./num.js"
import { add16, add8, add2, add10 } from "./add.js"
import { size16, size8, size2, size10 } from "./alloc.js"
import { one10, one16, one2, one8 } from "./num.js"
/**
* @param { symbol } a
*/
function not16B(a) {
switch (a) {
case S16_0: return S16_F;
case S16_1: return S16_E;
case S16_2: return S16_D;
case S16_3: return S16_C;
case S16_4: return S16_B;
case S16_5: return S16_A;
case S16_6: return S16_9;
case S16_7: return S16_8;
case S16_8: return S16_7;
case S16_9: return S16_6;
case S16_A: return S16_5;
case S16_B: return S16_4;
case S16_C: return S16_3;
case S16_D: return S16_2;
case S16_E: return S16_1;
case S16_F: return S16_0;
default: throw new Error("unexpected symbol");
}
}
/**
* @param { symbol } a
*/
function not8B(a) {
switch (a) {
case S8_0: return S8_7;
case S8_1: return S8_6;
case S8_2: return S8_5;
case S8_3: return S8_4;
case S8_4: return S8_3;
case S8_5: return S8_2;
case S8_6: return S8_1;
case S8_7: return S8_0;
default: throw new Error("unexpected symbol");
}
}
/**
* @param { symbol } a
*/
function not2B(a) {
switch (a) {
case S2_0: return S2_1;
case S2_1: return S2_0;
default: throw new Error("unexpected symbol");
}
}
/**
* @param { symbol } a
*/
function not10B(a) {
switch (a) {
case S10_0: return S10_9;
case S10_1: return S10_8;
case S10_2: return S10_7;
case S10_3: return S10_6;
case S10_4: return S10_5;
case S10_5: return S10_4;
case S10_6: return S10_3;
case S10_7: return S10_2;
case S10_8: return S10_1;
case S10_9: return S10_0;
default: throw new Error("unexpected symbol");
}
}
/**
* @param { Num } a
*/
export function not16(a) {
const { [kBuffer]: buff } = a;
for (let i = 0; i < size16; i++) {
buff[i] = not16B(buff[i]);
}
add16(a, one16);
}
/**
* @param { Num } a
*/
export function not8(a) {
const { [kBuffer]: buff } = a;
for (let i = 0; i < size8; i++) {
buff[i] = not8B(buff[i]);
}
add8(a, one8);
}
/**
* @param { Num } a
*/
export function not2(a) {
const { [kBuffer]: buff } = a;
for (let i = 0; i < size2; i++) {
buff[i] = not2B(buff[i]);
}
add2(a, one2);
}
/**
* @param { Num } a
*/
export function not10(a) {
const { [kBuffer]: buff } = a;
for (let i = 0; i < size10; i++) {
buff[i] = not10B(buff[i]);
}
add10(a, one10);
}
/**
* @param { Num } a
*/
export function not(a) {
switch (a.radix) {
case 2: return not2(a);
case 8: return not8(a);
case 16: return not16(a);
case 10: return not10(a);
default: throw new Error(`unsupported radix (${a.radix})`);
}
}