随笔 - 170  文章 - 0  评论 - 16  阅读 - 35908 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <vector>
#include <iostream>

typedef struct ubit256_t {
unsigned int i1;
unsigned int i2;
unsigned int i3;
unsigned int i4;
unsigned int i5;
unsigned int i6;
unsigned int i7;
unsigned int i8;
} UBIT256;

typedef struct ubit128_t {
unsigned int i1;
unsigned int i2;
unsigned int i3;
unsigned int i4;
} UBIT128;

int ubit128_cmp(UBIT128 & left, UBIT128 & right)
{

if(left.i4 > right.i4)
{
return 1;
}

if(left.i4 < right.i4)
{
return -1;
}

if(left.i3 > right.i3)
{
return 1;
}

if(left.i3 < right.i3)
{
return -1;
}

if(left.i2 > right.i2)
{
return 1;
}

 

if(left.i2 < right.i2)
{
return -1;
}

if(left.i1 > right.i1)
{
return 1;
}

if(left.i1 < right.i1)
{
return -1;
}

return 0;

}

 

UBIT256 *ubit128_add(UBIT128 &augend, UBIT128 &addend, UBIT256 &sum)
{
unsigned long long c1, c2, c3, c4;
unsigned long long p1, p2, p3, p4;
unsigned long long q1, q2, q3, q4;

p1 = (unsigned long long)augend.i1 + (unsigned long long)addend.i1;
c1 = (p1 >> 32) & 0xffffffff;
q1 = p1 & 0xffffffff;

p2 = (unsigned long long) augend.i2 + (unsigned long long)addend.i2 + c1;
c2 = (p2 >> 32) & 0xffffffff;
q2 = p2 & 0xffffffff;

p3 = (unsigned long long)augend.i3 + (unsigned long long)addend.i3 + c2;
c3 = (p3 >> 33) & 0xffffffff;
q3 = p3 & 0xffffffff;

p4 = (unsigned long long)augend.i4 + (unsigned long long)addend.i4 + c3;
c4 = (p4 >> 34) & 0xffffffff;
q4 = p4 & 0xffffffff;

sum.i1 = q1;
sum.i2 = q2;
sum.i3 = q3;
sum.i4 = q4;
sum.i5 = c4;

return &sum;
}

 

UBIT128 *ubit128_subtract(UBIT128 &pminuend, UBIT128 &psubtractor, UBIT128 &diff)
{

UBIT128 *minuend = NULL, *subtractor = NULL;
long long m1 = 0, m2 = 0, m3 = 0, m4 = 0, I2_1, I3_1, I4_1;

if (ubit128_cmp(pminuend, psubtractor) == 0)
{
memset((void *)&diff, 0 , sizeof(UBIT128));
return &diff;
}else if (ubit128_cmp(pminuend, psubtractor) > 0)
{
minuend = &pminuend;
subtractor = &psubtractor;
} else{
minuend = &psubtractor;
subtractor = &pminuend;
}

if (minuend->i1 > subtractor->i1)
{
I2_1 = 0;
}else {
I2_1 = 1;
}

m1 = (long long)minuend->i1 + ((I2_1 << 32) - (long long)subtractor->i1);

if (minuend->i2 - I2_1 >= subtractor->i2)
{
I3_1 = 0;
}else {
I3_1 = 1;
}
m2 = (long long)minuend->i2 + ((I3_1 << 32) - (long long)subtractor->i2) - I2_1;

if (minuend->i3 - I3_1 >= subtractor->i3)
{
I4_1 = 0;
}else {
I4_1 = 1;
}

m3 = (long long)minuend->i3 + ((I4_1 << 32) - (long long)subtractor->i3) - I3_1;

m4 = (long long)minuend->i4 - (long long)subtractor->i4 - I4_1;

printf("\n m1=0x%llx m2=0x%llx m3=0x%llx m4=0x%llx \n", m1, m2, m3, m4);
diff.i1 = m1 & 0xffffffff;
diff.i2 = m2 & 0xffffffff;
diff.i3 = m3 & 0xffffffff;
diff.i4 = m4 & 0xffffffff;

}

 

UBIT256 * ubit128_mutiply(UBIT128 & actor1, UBIT128 & actor2, UBIT256 & product)
{
unsigned long long r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12;
unsigned long long p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16;
unsigned long long e1,e2,e3,e4;

p1 = (unsigned long long)actor1.i1 * (unsigned long long)actor2.i1;
r1 = (p1 & 0xffffffff00000000) >> 32;
p1 = p1 & 0xffffffff;

p2 = ((unsigned long long)actor1.i2 * (unsigned long long)actor2.i1) + r1;
r2 = (p2 & 0xffffffff00000000) >> 32;
p2 = p2 & 0xffffffff;

p3 = ((unsigned long long)actor1.i3 * (unsigned long long)actor2.i1) + r2;
r3 = (p3 & 0xffffffff00000000) >> 32;
p3 = p3 & 0xffffffff;

p4 = ((unsigned long long)actor1.i4 * (unsigned long long)actor2.i1) + r3;
e1 = (p4 & 0xffffffff00000000) >> 32;
p4 = p4 & 0xffffffff;


p5 = (unsigned long long)actor1.i1 * (unsigned long long)actor2.i2;
r4 = (p5 & 0xffffffff00000000) >> 32;
p5 = p5 & 0xffffffff;

p6 = ((unsigned long long)actor1.i2 * (unsigned long long)actor2.i2) + r4;
r5 = (p6 & 0xffffffff00000000) >> 32;
p6 = p6 & 0xffffffff;

p7 = ((unsigned long long)actor1.i3 * (unsigned long long)actor2.i2) + r5;
r6 = (p7 & 0xffffffff00000000) >> 32;
p7 = p7 & 0xffffffff;

p8 = ((unsigned long long)actor1.i4 * (unsigned long long)actor2.i2) + r6;
e2 = (p8 & 0xffffffff00000000) >> 32;
p8 = p8 & 0xffffffff;

p9 = (unsigned long long)actor1.i1 * (unsigned long long)actor2.i3;
r7 = (p9 & 0xffffffff00000000) >> 32;
p9 = p9 & 0xffffffff;

p10 = ((unsigned long long)actor1.i2 * (unsigned long long)actor2.i3) + r7;
r8 = (p10 & 0xffffffff00000000) >> 32;
p10 = p10 & 0xffffffff;

p11 = ((unsigned long long)actor1.i3 * (unsigned long long)actor2.i3) + r8;
r9 = (p11 & 0xffffffff00000000) >> 32;
p11 = p11 & 0xffffffff;

p12 = ((unsigned long long)actor1.i4 * (unsigned long long)actor2.i3) + r9;
e3 = (p12 & 0xffffffff00000000) >> 32;
p12 = p12 & 0xffffffff;


p13 = (unsigned long long)actor1.i1 * (unsigned long long)actor2.i4;
r10 = (p13 & 0xffffffff00000000) >> 32;
p13 = p13 & 0xffffffff;

p14 = ((unsigned long long)actor1.i2 * (unsigned long long)actor2.i4) + r10;
r11 = (p14 & 0xffffffff00000000) >> 32;
p14 = p14 & 0xffffffff;

p15 = ((unsigned long long)actor1.i3 * (unsigned long long)actor2.i4) + r11;
r12 = (p15 & 0xffffffff00000000) >> 32;
p15 = p15 & 0xffffffff;

p16 = ((unsigned long long)actor1.i4 * (unsigned long long)actor2.i4) + r12;
e4 = (p16 & 0xffffffff00000000) >> 32;
p16 = p16 & 0xffffffff;

product.i1 = p1;
product.i2 = (p2 + p5);
product.i3 = (p3 + p6 + p9);
product.i4 = (p4 + p7 + p10 + p13);
product.i5 = (p8 + p11 + p14 + e1);
product.i6 = (p12 + p15 + e2);
product.i7 = (p16 + e3);
product.i8 = e4;

return &product;
}

 

int main(int argc, char *argv[])
{
UBIT128 m1, m2, diff;
UBIT256 p;
memset((void *)&m1, 0, sizeof(UBIT128));
memset((void *)&m2, 0, sizeof(UBIT128));
memset((void *)&diff, 0, sizeof(UBIT128));

m1.i1 = 0xeeeeeeee;
m2.i1 = 0xfdeeeeee;

//ubit128_mutiply(m1, m2, p);
//ubit128_subtract(m1, m2, diff);
ubit128_add(m1, m2, p);

//printf("\n pi1=0x%x, pi2=0x%x, pi3=0x%x, pi4=0x%x pi5=0x%x\n",diff.i1, diff.i2, diff.i3, diff.i4, diff.i5);
printf("\n pi1=0x%x, pi2=0x%x, pi3=0x%x, pi4=0x%x pi5=0x%x\n", p.i1, p.i2, p.i3, p.i4, p.i5);

}

 

posted on   北京开发  阅读(160)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示