前言
在工作中用sendMessage的方法向另外一个进程中传递窗体的位置,长度,宽度四个值,但是sendMessage的方法签名中只有两个参数。于是在网上找到了一些代码,找到了这个利用位运算来合并参数的方法。、
代码
// 这个方法只接受一个参数
void ConnectFn(int a)
{
int first = a >> 16;
int second = (first << 16) ^ a;
Console.WriteLine("firstparam:{0},secondParam:{1}",first,second);
}
// 需要传递的两个参数
int firstParam = 123;
int secondParam = 456;
int intermediateParam = firstParam << 16 | secondParam;
// 传入参数
ConnectFn(intermediateParam);
原理
总体的思路就是将int的32位拆成两部分,分别储存两个数,这其实也对储存数字的大小产生了限制。
- 先将 firstParam 的 123 的值 转换为二进制为
1111011
- 将这个值左移16位 得到的值为
11110110000000000000000
- 再跟第二个参数456
111001000
进行或运算(1 | 1 = 1 ;0| 1 = 1; 0 | 0 = 0),相当于将第二个的参数值复制到空白的16位上。
这样就将两个参数合并了成一个参数
- 在解析的时候,先将中间参数左移16位得到的就是
1111011
- 然后将得到的
1111011
右移16位,再次得到11110110000000000000000
-
11110110000000000000000
与11110110000000111001000
进行异或运算(0 ^ 0 = 0; 1 ^ 1 = 0; 0 ^ 1 = 1 )
这样就完成了一个参数承载两个变量的任务了