请高手给解决思路!解决思路
请高手给解决思路!
问题如下:
在嵌入式平台上经常遇到64位类型的整数不支持,在win32里是用__int64.要解决这种平台上不支持的情况,而在实际中会用到64位整数问题,只能通过两个32位整数来进行64位整数的操作.这样,这个任务就产生了.
涉及到的64位整数的操作有:
1. *(乘) /(除) %(求余)
2. +(加) -(减)
3. < <(位左移) > > (位右移)
4. <(小于) <=(小于等于) > (大于) > =(大于等于)
5. ==(等于) !=(不等于)
6. &(位与)
7. ^(位异或)
8. |(位或)
9. &&(逻辑与)
10. ||(逻辑或)
11. = += -=
我用一结构体来定义该64位数,struct int64{unsigned long high,unsigned long low};其中high表高32位,low表低32位,现在的问题是如何实现进位,以及如何判断溢出.比如::x.high=4294967295,x.low=4294967295;y.high=4294967295;y.low=4294967295,若要x+y,则x.low+y.low如何实现进位?若结果保存在result中,则result.low又如何确定,急请回复,谢谢!
------解决方案--------------------
就像小学生列竖式做算术一样。
RSA算法中带的大整数类,有参考价值。
------解决方案--------------------
要是C++的话 可以用重载来实现,不需要改原来的代码.
C语言就难说了,期待高手给一个方案学习学习
------解决方案--------------------
加法,楼主其他的可以参考着做.
z=x+y
z.low = x.low+y.low;
z.high = x.high+y.high+(z.low <x.low);
------解决方案--------------------
result.low=((ULONG_MAX-(ULONG_MAX-x.low+ULONG_MAX-y.low))+1)/ULONG_MAX;
------解决方案--------------------
所谓的进位其实就是溢出,
当发生溢出后,
result.low 就是溢出后剩余的部分(高位被溢出了),
那么由于溢出,result.low 会小于任何一个操作数,
所以使用 if(result.low <x.low) 判断是否发生溢出,
然后相应的分支控制 result.high= x.high+y.high; 还是 lt.high= x.high+y.high+1; 即可
问题如下:
在嵌入式平台上经常遇到64位类型的整数不支持,在win32里是用__int64.要解决这种平台上不支持的情况,而在实际中会用到64位整数问题,只能通过两个32位整数来进行64位整数的操作.这样,这个任务就产生了.
涉及到的64位整数的操作有:
1. *(乘) /(除) %(求余)
2. +(加) -(减)
3. < <(位左移) > > (位右移)
4. <(小于) <=(小于等于) > (大于) > =(大于等于)
5. ==(等于) !=(不等于)
6. &(位与)
7. ^(位异或)
8. |(位或)
9. &&(逻辑与)
10. ||(逻辑或)
11. = += -=
我用一结构体来定义该64位数,struct int64{unsigned long high,unsigned long low};其中high表高32位,low表低32位,现在的问题是如何实现进位,以及如何判断溢出.比如::x.high=4294967295,x.low=4294967295;y.high=4294967295;y.low=4294967295,若要x+y,则x.low+y.low如何实现进位?若结果保存在result中,则result.low又如何确定,急请回复,谢谢!
------解决方案--------------------
就像小学生列竖式做算术一样。
RSA算法中带的大整数类,有参考价值。
------解决方案--------------------
要是C++的话 可以用重载来实现,不需要改原来的代码.
C语言就难说了,期待高手给一个方案学习学习
------解决方案--------------------
加法,楼主其他的可以参考着做.
z=x+y
z.low = x.low+y.low;
z.high = x.high+y.high+(z.low <x.low);
------解决方案--------------------
result.low=((ULONG_MAX-(ULONG_MAX-x.low+ULONG_MAX-y.low))+1)/ULONG_MAX;
------解决方案--------------------
所谓的进位其实就是溢出,
当发生溢出后,
result.low 就是溢出后剩余的部分(高位被溢出了),
那么由于溢出,result.low 会小于任何一个操作数,
所以使用 if(result.low <x.low) 判断是否发生溢出,
然后相应的分支控制 result.high= x.high+y.high; 还是 lt.high= x.high+y.high+1; 即可