平衡三进制存算一体架构

PS:天天水一贴,快乐又舒心。。。

 1、存算一体概念

        最近想搞平衡三进制的虚拟机,但是写来写去都感觉不对味,能用是能用,但写起来感觉就是很奇怪,用了二种编码,想来想去是不够原生三进制的编写,有点生搬硬套的感觉,所以又去翻翻了图灵他老人家的定义,突然就有了灵感。

        二进制用的是纸带,而三进制多了一个维度,所以应该将高度加上,这样纸带就变成了表格了,这一转变就合理多了,纸带被划分成一系列的方格,每个方格包含一个符号,然后就是状态寄存器及状态转换器,分别用于存储一个表格及转换一个表格,也就是说,只用根据地址取数据和存放数据,它就可以完成相关的运算,也验证了那一句话:算即是存,存即是算。


1.1九九乘法表的应用

        不得不说老祖宗流传下来的东西,确实是博大精深,这下面其实就是一个矩阵了,可将下面的图,转换成矩阵用于计算乘法,电路中没有专用的运算单元,只要能根据地址取数据及存放数据,一样可以完成运算,完美权释了存算一体的概念:算即是存,存即是算。

九九乘法表

        其实很好理解,比如:7*9=63,7和9你可以理解它不是数据值,而一个地址值,地址7及地址9,对应的就是63,这样就是输入数据(相当于地址值),查询得到新的输出值存起来,这样就完成了一次运算, 将运算得到的规律,制成一个矩阵,这根Chatgpt的训练过程有点像,只不过它不知道九九乘法表,要自己训练出来,而这里是知道了结果,直接将结果应用过去,而不断的矩阵变换,就是运算的过程,真的没想到图灵机的定义,原来是可以超脱进制进行计算的,而纸带感觉确实是少了一维度,真正的人工智能应是建立在矩阵上,就像Chatgpt那样一层一层的。


1.2九九乘法表的应用

        都说了算即是存,存即是算,那不用一下,显得我就不那么科学了,目标是用上面的九九乘法表去完成运算,但乘法的基础是加法,所以用了方便,先要实现十进制的加法表和十进制的乘法表,用Excel例出,如下所示:

加法表及九九乘法表

        这样就有了图表,可以将其转换成数组用于计算,这里用C++程序简单演示一下,所以上述逻辑可以得:

#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
const int OFFSET=48;

int DSUM[10][10] = {
		{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
        {1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
        {2, 3, 4, 5, 6, 7, 8, 9, 0, 1},
        {3, 4, 5, 6, 7, 8, 9, 0, 1, 2},
        {4, 5, 6, 7, 8, 9, 0, 1, 2, 3},
        {5, 6, 7, 8, 9, 0, 1, 2, 3, 4},
        {6, 7, 8, 9, 0, 1, 2, 3, 4, 5},
        {7, 8, 9, 0, 1, 2, 3, 4, 5, 6},
        {8, 9, 0, 1, 2, 3, 4, 5, 6, 7},
        {9, 0, 1, 2, 3, 4, 5, 6, 7, 8}
    };
 int DCOMS[10][10] = {
 		{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
        {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
        {0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
        {0, 0, 0, 0, 0, 0, 1, 1, 1, 1},
        {0, 0, 0, 0, 0, 1, 1, 1, 1, 1},
        {0, 0, 0, 0, 1, 1, 1, 1, 1, 1},
        {0, 0, 0, 1, 1, 1, 1, 1, 1, 1},
        {0, 0, 1, 1, 1, 1, 1, 1, 1, 1},
        {0, 1, 1, 1, 1, 1, 1, 1, 1, 1}
     };  
     
     
int DMULSUM[10][10] = {
		{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
        {0, 2, 4, 6, 8, 0, 2, 4, 6, 8},
        {0, 3, 6, 9, 2, 5, 8, 1, 4, 7},
        {0, 4, 8, 2, 6, 0, 4, 8, 2, 6},
        {0, 5, 0, 5, 0, 5, 0, 5, 0, 5},
        {0, 6, 2, 8, 4, 0, 6, 2, 8, 4},
        {0, 7, 4, 1, 8, 5, 2, 9, 6, 3},
        {0, 8, 6, 4, 2, 0, 8, 6, 4, 2},
        {0, 9, 8, 7, 6, 5, 4, 3, 2, 1}
    };
int DMULCOMS[10][10] = {
		{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 1, 1, 1, 1, 1},
        {0, 0, 0, 0, 1, 1, 1, 2, 2, 2},
        {0, 0, 0, 1, 1, 2, 2, 2, 3, 3},
        {0, 0, 1, 1, 2, 2, 3, 3, 4, 4},
        {0, 0, 1, 1, 2, 3, 3, 4, 4, 5},
        {0, 0, 1, 2, 2, 3, 4, 4, 5, 6},
        {0, 0, 1, 2, 3, 4, 4, 5, 6, 7},
        {0, 0, 1, 2, 3, 4, 5, 6, 7, 8}
    };



// 逐位加法
string decimalAdder(string str1,string str2){
	// 找到最大长度
	size_t maxLength = max(str1.length(), str2.length());
	// 填充短的字符串
	str1 = string(maxLength - str1.length(), '0') + str1;
	str2 = string(maxLength - str2.length(), '0') + str2;
	//创建result存结果
	string result(maxLength, '0');
	int preCarry=0;
	int nowCarry = 0;
	int preSum=0;
	int nowSum=0;

	cout<<str1<<endl<<"+"<<endl<<str2<<endl<<"="<<endl;
	// 从最低位到最高位逐位处理
	for (int i = maxLength - 1; i >= 0; --i) {
	    int a = str1[i] - OFFSET;
	    int b = str2[i] - OFFSET;
		//自身相加位
		preSum= DSUM[a][b];
		
		//更新为最终加和位的值
		nowSum=DSUM[preCarry][preSum];
		//更新为最终进位位的值(9+4+1/8+1+1/9+0+1)
		//(自身进位)或(前面进位与自身和preSum)有进位都行
		nowCarry = DCOMS[a][b] || DCOMS[preCarry][preSum];
		
		//更新前一位的进位结果
		preCarry=nowCarry;
		result[i] = OFFSET +nowSum;
		//cout<<nowSum<<":"<<nowCarry<<endl;
	}

	// 处理最后的进位
	if (preCarry!=0) result = "1" + result;
	return result;
}


// 并位加法(先计算出全部进位,硬件上叫先行进位法)
string decimalParallelAdder(string str1,string str2){
	// 找到最大长度
	size_t maxLength = max(str1.length(), str2.length());
	// 填充短的字符串
	str1 = string(maxLength - str1.length(), '0') + str1;
	str2 = string(maxLength - str2.length(), '0') + str2;
	// 创建进位数组
	int carryArry[maxLength + 1] = {0};
	// 创建result存结果
	string returnResult(maxLength, '0');
	
	int preCarry=0;
	int nowSum=0;
	//cout<<str1<<endl<<"+"<<endl<<str2<<endl<<"="<<endl;
	// 从最低位到最高位逐位处理
	for (int i = maxLength - 1; i >= 0; --i) {
	    int a = str1[i] - OFFSET;
	    int b = str2[i] - OFFSET;
		preCarry = DCOMS[a][b] || DCOMS[preCarry][DSUM[a][b]];
		//提前算出全部进位
		carryArry[i]=preCarry;
	}
	// 进位偏置相加得到结果
	for (int i = 0; i <maxLength; ++i) {
	    int a = str1[i] - OFFSET;
	    int b = str2[i] - OFFSET;
		preCarry=carryArry[i+1];
		nowSum=DSUM[preCarry][DSUM[a][b]];
		returnResult[i]=OFFSET +nowSum;
	}
	//处理进位
	if(carryArry[0]==1)returnResult="1"+returnResult;
	return returnResult;
}



//执行单位的乘法
string toRunMultiply(string str,char c,size_t maxLength){
	//创建result存结果
	string sumResult(maxLength + 1, '0');
	string carryResult(maxLength + 1, '0');
	
    int a = 0;
    int b = c-OFFSET;
	for(int i=0;i<str.length();i++){
		a=str[i]-OFFSET;
		sumResult[i+1]=OFFSET + DMULSUM[a][b];
		carryResult[i]=OFFSET + DMULCOMS[a][b];
	}
	
	return decimalParallelAdder(sumResult,carryResult);
}

// 逐位乘法
string decimalMultiply(string str1,string str2){
	bool isMax=(str1.length()> str2.length());
	string maxString=isMax?str1:str2;
	string minString=isMax?str2:str1;
	int minLength=minString.length()-1;
	string returnResult="";
	vector<string> stringArray;
	//每一位乘法
	for(int i=0;i<minString.length();++i){
		returnResult=toRunMultiply(maxString,minString[minLength-i],maxString.length());
		returnResult = returnResult+string(i, '0');
		stringArray.push_back(returnResult);
	}
	//将所以结果,累加到一起
	for (size_t i =0; i <stringArray.size()-1; ++i) {
		returnResult=decimalParallelAdder(stringArray[i],returnResult);
	}
	//去掉最前面的0
	if(returnResult[0] == '0')returnResult.erase(0, 1); 
	
	return returnResult;
}




int main()
{
	cout<<decimalMultiply("12345","157")<<endl;
	//cout<<decimalParallelAdder("8945121","46548121")<<endl;
	//cout<<decimalAdder("123","9")<<endl;
	//cout<<(8945121+46548121);
    return 0;
}

        So,你说这个有什么用?靠北了,真的是太逊了,你不觉得它可以用来算加法及九九乘法,不是太酷了吗?So,这个有什么用?好吧,还是有一点用处的,比如它可以算超大整形的加法运算及乘法运算,用的也是模拟人用十进制来运算的逻辑,当然无独有偶的,也用人想用这原理弄硬件的十进制计算机,好像投了十几万进去,有一定可行性,能不能商用就是另外一会事了,就像三进制计算机,如果没有好的技术性出来,商业应用遥遥无期,这里超级大数运算的网站,同样可以算连long类型都无法表示的数据,如下所示:


1.3加法的并行性讨论

        上面的乘法结果是正确的,而乘法的函数又用到了加法函数,所以都是正确运算的,当然超级大的数可以用算法可以加速,而不一定用上面的方法,只是提供一个思路,用十进制模拟逻辑门及九九乘法来完成运算,而加法运算能不能并行呢?

        答案是可以,但又不可以。你这个是什么鬼答案,答了跟没答似的,别急先理解一下并行计算,如果将一次加法运算,比喻成蚕丝被的制作过程,那就会有养蚕、剥茧、抽丝,制布等过程,一系列过程后,最终才是蚕丝被的制作,并行就是可以将复杂任务,分成多个简单任务,同时进行处理的过程,而有些步骤只能串行执行,并不能同时执行的。

        就像刚开始,没有蚕丝就不能弄蚕丝被,先决条件定死了,没有前面的进位,那后面的进位就算不出来,那不说加法无法并行计算,事实并非如此,一个加法运算完全并行做不到,但可以部分并行计算,如:超前进位加法器,它就是用空间来换时间,也就说在电路上,它提前算出加法的所以进位位,然后再去计算和就快多了,就像是工厂提前制作好的零件,直接组装就行了,而进位的计算就是串行了,但求和最后又是并行的,所以答案是可以,但又不可以,为了更方便理解,我还写了个按层相加程序,如下所示:

#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
const int OFFSET=48;

int DSUM[10][10] = {
		{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
        {1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
        {2, 3, 4, 5, 6, 7, 8, 9, 0, 1},
        {3, 4, 5, 6, 7, 8, 9, 0, 1, 2},
        {4, 5, 6, 7, 8, 9, 0, 1, 2, 3},
        {5, 6, 7, 8, 9, 0, 1, 2, 3, 4},
        {6, 7, 8, 9, 0, 1, 2, 3, 4, 5},
        {7, 8, 9, 0, 1, 2, 3, 4, 5, 6},
        {8, 9, 0, 1, 2, 3, 4, 5, 6, 7},
        {9, 0, 1, 2, 3, 4, 5, 6, 7, 8}
    };
 int DCOMS[10][10] = {
 		{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
        {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
        {0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
        {0, 0, 0, 0, 0, 0, 1, 1, 1, 1},
        {0, 0, 0, 0, 0, 1, 1, 1, 1, 1},
        {0, 0, 0, 0, 1, 1, 1, 1, 1, 1},
        {0, 0, 0, 1, 1, 1, 1, 1, 1, 1},
        {0, 0, 1, 1, 1, 1, 1, 1, 1, 1},
        {0, 1, 1, 1, 1, 1, 1, 1, 1, 1}
     };  
int DOR[2][2]={
	{0,1},
	{1,1}	
};

const int inputSize=6;  
int inputArry[inputSize]={1,8,3,9,1,9};
//int inputArry[inputSize]={1,8,3,7,1,9};


int modifyArray[inputSize+1]={0,0,0,0,0,0,0};


int a,b,c,d,e,f;
void Chuhua();
void printArray(const int arr[], int size);
int reSum(int input1,int input2);
int reCOMS(int input1,int input2);
void reFirLayer(int* arr);
void reSecLayer(int* arr);
void reThrLayer(int* arr);


int main()
{
	Chuhua();
	cout<<a<<":"<<b<<":"<<c<<":"<<d<<":"<<e<<":"<<f<<endl;
	//转换全部
	reFirLayer(modifyArray);
	//算出全部进位
	reSecLayer(modifyArray);
	
	
	//出结果前4位(183+919=1102)
	reThrLayer(modifyArray);
	printArray(modifyArray,inputSize+1);
    return 0;
}

void Chuhua(){
	a=inputArry[0];
	b=inputArry[1];
	c=inputArry[2];
	d=inputArry[3];
	e=inputArry[4];
	f=inputArry[5];
}
void printArray(const int arr[], int size) {
    for(int i = 0; i < size; ++i) {
        cout << "Element at index " << i << " : " << arr[i] << endl;
    }
}
int reSum(int input1,int input2){
	return DSUM[input1][input2];
}
int reCOMS(int input1,int input2){
	return DCOMS[input1][input2];
}
void reFirLayer(int* arr){
	arr[1]=reSum(a,d);
	arr[2]=reSum(b,e);
	arr[3]=reSum(c,f);
	arr[4]=reCOMS(a,d);
	arr[5]=reCOMS(b,e);
	arr[6]=reCOMS(c,f);
}
void reSecLayer(int* arr){
	//这里确实不能并行,只能串行,从最底位开始
	arr[6]=
	DOR[arr[6]][reCOMS(arr[3],0)];	
	arr[5]=
	DOR[arr[5]][reCOMS(arr[2],arr[6])];
	arr[4]=
	DOR[arr[4]][reCOMS(arr[1],arr[5])];
}
void reThrLayer(int * arr){
	arr[0]=reSum(arr[0],arr[4]);
	arr[1]=reSum(arr[1],arr[5]);
	arr[2]=reSum(arr[2],arr[6]);
	arr[3]=reSum(arr[3],0);
}

2、矩阵计算机

        这只是个猜想,矩阵计算机:算即是存,存即是算。一切数据的运算,都是矩阵的不断变化,且会超脱进制限制,可模拟任何的方式的运算,它核心思想就是不断的查矩阵,获取新的值输送到另一个矩阵中,硬件上结合Gpu及高效存储的方式,这种运算过程更加接近人脑的运算过程,也是目前人工智能的基本盘,感觉很离谱但也很神奇,一种新的架构,是在图灵他老人家定义上的一次扩展,更有着并行计算、分布式计算的特点,这就矩阵计算机。


2.1矩阵数据的输入

       数据都为矩阵,为了简便就使用数组来运算,输入的数据当然也要转换成数组,转换方法有两种:一个是分成相同的n个矩阵、还有就是合成一个更大的矩阵,最高位为左上角,最低位为右下角,像一个弓形一样读取与写入,可视为输入单位,如下所示:


2.2矩阵状态转换存储器

        可以理解为固定死的数组,不像是chatGpt那样,可以反向调整权重,这是一种预先编好的转换表,就跟上面的九九乘法表运算差不多,这个矩阵是固定下来的,只可以读的,然后根据地址输出相应的值,用一个或多个矩阵放入读取,结果用新的矩阵存起来,这样就形成了运算的过程,它是超脱了进制限制,所以也试平衡三进制加法吧,如下所示:

平衡三进制半加器真值表

        当然,平衡三进制有T、0、1,而T代表-1,而数组是从0开始的,不能以-1开始,所以这是个问题,不能-1开始,那也没问题,思维足够抽象,现在不要将0、1、2看成数字,只看成是字符,用映射的方法,也就是T/0/1变成0/1/2,而T映射为2,所以调整一下次序,就可以得到相同效果,如下所示:

        电路中可以用2个平衡三进制半加器及1个调和门,组成一个平衡三进制全加器,而这里更简捷了,直接用一个3维数组就行了,平衡三进制全加器27种结果,如下所示:

        用上述方法,直接模拟逻辑门,简捷而高效的实现,只要用2个数组的,就可轻松完成平衡三进制加法运算,代码如下所示:

#include <iostream>
#include <string.h>
using namespace std;
char balanceIndex[3] = {'0','1','T'};

int TSUM[3][3] = {
        {0, 1, 2},
        {1, 2, 0},
        {2, 0, 1}
    };
int TCOMS[3][3] = {
        {0, 0, 0},
        {0, 1, 0},
        {0, 0, 2}
    };

int TFULLSUM[3][3][3] = {
	{
		{0,1,2},
		{1,2,0},
		{2,0,1}
	},
	{
		{1,2,0},
		{2,0,1},
		{0,1,2}
	},
	{
		{2,0,1},
		{0,1,2},
		{1,2,0}
	}
};

int TFULLCOMS[3][3][3] = {
	{
		{0,0,0},
		{0,1,0},
		{0,0,2}
	},
	{
		{0,1,0},
		{1,1,0},
		{0,0,0}
	},
	{
		{0,0,2},
		{0,0,0},
		{2,0,2}
	}
};

int charToInt(char c){
	switch (c) {
		case '0':return 0;
		case '1':return 1;
		case 'T':return 2;
	}
	return -1;
}


// 并位加法
string ternaryParallelAdder(string str1,string str2){
	// 找到最大长度
	size_t maxLength = max(str1.length(), str2.length());
	// 填充短的字符串
	str1 = string(maxLength - str1.length(), '0') + str1;
	str2 = string(maxLength - str2.length(), '0') + str2;
	// 创建进位数组
	int carryArry[maxLength + 1] = {0};
	// 创建result存结果
	string returnResult(maxLength, '0');
	
	
	int preCarry=0;
	int nowSum=0;
	cout<<str1<<endl<<"+"<<endl<<str2<<endl<<"="<<endl;
	// 从最低位到最高位逐位处理
	for (int i = maxLength - 1; i >= 0; --i) {
	    int a = charToInt(str1[i]);
	    int b = charToInt(str2[i]);
	    preCarry=TFULLCOMS[preCarry][a][b];
		//提前算出全部进位,进位计算只能串行计算,
		//前面1位依靠后面1位的计算结果进行
		carryArry[i]=preCarry;
	}
	
	// 进位偏置相加得到结果
	for (int i = 0; i <maxLength; ++i) {
		int a = charToInt(str1[i]);
		int b = charToInt(str2[i]);
		preCarry=carryArry[i+1];
		nowSum=TFULLSUM[preCarry][a][b];
		returnResult[i]=balanceIndex[nowSum];
	}
	//添加进位
	if(carryArry[0]!=0)returnResult=balanceIndex[carryArry[0]]+ returnResult;
	
	return returnResult;
}


int main()
{
	cout<<ternaryParallelAdder("1111","11TT");
	//cout<<ternaryParallelAdder("T11","T11");
    return 0;
}

        都说了,超脱进制限制,那二进制的运算也是可以用行,先上个二进制全加器真值,也就是用个2*2*2的数组就行了,如下所示:

代码如下:

#include <iostream>
#include <string.h>
using namespace std;
const int OFFSET=48;
char binaryIndex[2] = {'0','1'};

int BFULLSUM[2][2][2] = {
	{
		{0,1},
		{1,0}
	},
	{
		{1,0},
		{0,1}
	}
};
int BFULLCOMS[2][2][2] = {
	{
		{0,0},
		{0,1}
	},
	{
		{0,1},
		{1,1}
	}
};

// 并位加法
string binaryParallelAdder(string str1,string str2){
	// 找到最大长度
	size_t maxLength = max(str1.length(), str2.length());
	// 填充短的字符串
	str1 = string(maxLength - str1.length(), '0') + str1;
	str2 = string(maxLength - str2.length(), '0') + str2;
	// 创建进位数组
	int carryArry[maxLength + 1] = {0};
	// 创建result存结果
	string returnResult(maxLength, '0');
	
	int preCarry=0;
	int nowSum=0;
	cout<<str1<<endl<<"+"<<endl<<str2<<endl<<"="<<endl;
	// 从最低位到最高位逐位处理
	for (int i = maxLength - 1; i >= 0; --i) {
	    int a = str1[i]-OFFSET;
	    int b = str2[i]-OFFSET;
	    //提前算出全部进位,进位计算只能串行计算,
	    preCarry=BFULLCOMS[preCarry][a][b];
		//前面1位依靠后面1位的计算结果进行
		carryArry[i]=preCarry;
	}
	
	// 进位偏置相加得到结果
	for (int i = 0; i <maxLength; ++i) {
	    int a = str1[i]-OFFSET;
	    int b = str2[i]-OFFSET;
		preCarry=carryArry[i+1];
		nowSum=BFULLSUM[preCarry][a][b];
		returnResult[i]=binaryIndex[nowSum];
	}
	//添加进位
	if(carryArry[0]!=0)returnResult="1"+ returnResult;
	
	return returnResult;
}


int main()
{

	cout<<binaryParallelAdder("111111000111111","11110011111111");
    return 0;
}


2.3矩阵状态寄存器

        上面的矩阵状态转换存储器,感觉像是ERom,也就是固定死的,或者说是可以编程的多维数组,但有个离谱的猜想,能不能用Mysql或Redis,来实现嵌套表格实现运算什么的,想想都离谱,说有个家伙有我那建了个表,然后不断访问就完成它的计算,或者说也不用建了个表,直接随机访问,只要知道每次返回的值是固定的,将它弄成地址表,不断的访问,用来完成计算,这方法就很离谱了,有一定可能性,这属于是间隔“借”算力的离谱操作了,而这矩阵状态寄存器,是像内存Ram断电没数据,用来存中间运算数据,要永久保存则要运到硬盘或其它机器上,这就是它的大概实现了。


 3、在模拟逻辑门中的应用

        写到这里,就有了一种简捷而高效的实现方式,使用查找表方法来模拟逻辑门,简捷而高效。通过预先定义的查找表,所有的逻辑运算都可以简化为数组查找操作,这比逐位计算和判断要快得多。可扩展性也很强,只需简单的重新定义数组转换表,就可很轻松地扩展到其他进制,直接模拟任意进制逻辑门的操作。通过这种方法,可以非常方便地扩展到多种进制,同时保持高效的计算性能,这大大提高了计算速度和实现简便性。


3.1二进制模拟逻辑门

        通过定义不同的加法和进位表,可以直接模拟各种逻辑门。例如,二进制的AND、OR、XOR门可以通过以下方式实现:

int AND_SUM[2][2] = {
    {0, 0},
    {0, 1}
};

int OR_SUM[2][2] = {
    {0, 1},
    {1, 1}
};

int XOR_SUM[2][2] = {
    {0, 1},
    {1, 0}
};

char binaryIndex[2] = {'0', '1'};

string binaryLogicOperation(string str1, string str2, int SUM[2][2]) {
    size_t maxLength = max(str1.length(), str2.length());
    str1 = string(maxLength - str1.length(), '0') + str1;
    str2 = string(maxLength - str2.length(), '0') + str2;

    string returnResult(maxLength, '0');
    for (int i = 0; i < maxLength; ++i) {
        int a = str1[i] - OFFSET;
        int b = str2[i] - OFFSET;
        returnResult[i] = binaryIndex[SUM[a][b]];
    }
    return returnResult;
}

使用上述函数可以模拟AND、OR和XOR门操作:

cout << binaryLogicOperation("1100", "1010", AND_SUM) << endl;  // 输出 1000
cout << binaryLogicOperation("1100", "1010", OR_SUM) << endl;   // 输出 1110
cout << binaryLogicOperation("1100", "1010", XOR_SUM) << endl;  // 输出 0110

3.2平衡三进制模拟逻辑门

        同样的方式,可以扩展到其他进制,更多平衡三进制逻辑门看平衡三进制计算机模拟2的真值表。以下是平衡三进制的AND门、OR门、XOR门实现:

int TAND_SUM[3][3] = {
    {0, 0, 0},
    {0, 1, 0},
    {0, 0, 2}
};

int TOR_SUM[3][3] = {
    {0, 1, 2},
    {1, 1, 2},
    {2, 2, 2}
};

int TXOR_SUM[3][3] = {
    {0, 1, 2},
    {1, 0, 1},
    {2, 1, 0}
};

char ternaryIndex[3] = {'0', '1', 'T'};

string ternaryLogicOperation(string str1, string str2, int SUM[3][3]) {
    size_t maxLength = max(str1.length(), str2.length());
    str1 = string(maxLength - str1.length(), '0') + str1;
    str2 = string(maxLength - str2.length(), '0') + str2;

    string returnResult(maxLength, '0');
    for (int i = 0; i < maxLength; ++i) {
        int a = charToInt(str1[i]);
        int b = charToInt(str2[i]);
        returnResult[i] = ternaryIndex[SUM[a][b]];
    }
    return returnResult;
}

使用该函数可以模拟三进制的AND、OR和XOR操作:

cout << ternaryLogicOperation("1100", "1010", TAND_SUM) << endl;  // 输出 1000
cout << ternaryLogicOperation("1100", "1010", TOR_SUM) << endl;   // 输出 1110
cout << ternaryLogicOperation("1100", "1010", TXOR_SUM) << endl;  // 输出 0110

3.3应用领域及扩展性

        这种利用查找表的方法来模拟逻辑门的方式,可以应用在很多计算领域和系统中,特别是那些需要高效执行逻辑运算和处理多种进制的场景。以下是一些可能的应用领域和扩展性:

应用领域

  1. 计算机硬件设计
    》数字电路设计:在设计复杂的数字电路时,可以使用查找表方法来简化电路的实现,尤其是在需要高效的并行计算时。
    》FPGA:在FPGA编程中,使用查找表可以大大简化逻辑单元的设计和实现,提高硬件的计算速度和资源利用率。
  2. 计算机仿真
    》处理器仿真:在模拟各种处理器架构时,可以使用这种方法来高效地模拟处理器的逻辑运算和控制单元。
    》计算机体系结构研究:研究新的计算机架构,如基于多进制或非传统进制的计算机,可以使用查找表方法进行快速原型设计和验证。
  3. 软件开发
    》编译器优化:编译器可以利用查找表来优化生成的机器码,使得逻辑运算的执行速度更快。
    》高性能计算:在需要大量逻辑运算的高性能计算场景中,可以使用查找表来提高计算效率。
  4. 人工智能和机器学习
    》神经网络加速:在设计和优化神经网络时,可以使用查找表来加速神经元的计算和逻辑运算。
    》离散事件模拟:在模拟离散事件系统时,可以使用查找表来高效处理事件的逻辑关系和状态转换。

扩展性

  1. 多进制支持
    扩展到更多进制:可以非常容易地扩展到三进制、四进制甚至更高进制,只需要定义相应的查找表即可。
    》自定义进制:对于特定应用场景,可以定义自定义的进制和相应的查找表,以满足特定需求。
  2. 复杂逻辑功能
    组合逻辑电路:可以使用查找表来实现复杂的组合逻辑电路,如加法器、乘法器、比较器等。
    时序逻辑电路:可以扩展到时序逻辑电路,通过定义状态转换表来实现复杂的时序逻辑功能。
  3. 并行计算
    大规模并行处理:在并行计算环境中,可以使用查找表方法来高效地进行并行逻辑运算,提高计算效率和吞吐量。
    》GPU加速:可以利用GPU的并行计算能力,通过CUDA或OpenCL等技术,将查找表方法与GPU结合使用,可以充分利用GPU的并行计算能力,从而显著提高计算效率。
  4. 定制硬件实现
    ASIC设计:在定制ASIC芯片设计中,可以使用查找表来实现高效的逻辑运算,优化芯片性能和功耗。
    》嵌入式系统:在嵌入式系统中,可以使用查找表方法来实现高效的逻辑控制和数据处理,提高系统的响应速度和性能。

结语:

用这种存算一体的结构,感觉就很适合分布式计算及并行计算,结合一下GPU的并行,存算一体式构想,弄出一个在Gpu上跑或是像Redis那样在内存中跑的机器,或者说弄出一台什么进制都能跑的机器来,会不会很流弊,真是想想让人都兴奋呢!

批语:理想很美好,现实很骨感。。、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值