编译器? 求解两数演算
编译器? 求解两数运算?
这个问题也不算新鲜了,换一种方式提问就是"如何不用 + - * / 运算符,来求解两元素之和"的问题;大家很自然的回想起利用位运算。在数字电路中,我们都遇到过设计“加法器”的问题,利用位与、或、非、异或可以很轻松的解决此问题;这里,不用此方式,而是借助编译器的地址偏移,来解决问题。
基本思路如下:
(1)将其中int型数据转为地址(或者说是一个数组的首地址)
(2)然后利用数组下角标索引,进行地址偏移,获取偏移后的address
这个问题也不算新鲜了,换一种方式提问就是"如何不用 + - * / 运算符,来求解两元素之和"的问题;大家很自然的回想起利用位运算。在数字电路中,我们都遇到过设计“加法器”的问题,利用位与、或、非、异或可以很轻松的解决此问题;这里,不用此方式,而是借助编译器的地址偏移,来解决问题。
基本思路如下:
(1)将其中int型数据转为地址(或者说是一个数组的首地址)
(2)然后利用数组下角标索引,进行地址偏移,获取偏移后的address
(3)将(2)中得到的地址转换为int类型
下面贴出code,几行的事儿,但可以深深的吸引着我们的脑洞:
// ptrtest.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<iostream> using namespace std; int add(int a,int b){ char * c; c = reinterpret_cast<char*>(a); char * d=&c[b]; int sum=reinterpret_cast<int>(d); return sum; } int _tmain(int argc, _TCHAR* argv[]) { cout <<"sum =" <<add(4,5) << endl; return 0; }
让我们欣赏一下watch窗口,顿时脑洞打开吧!