C# 利用位运算传递多个参数方法

前言

在工作中用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
  • 再跟第二个参数456111001000进行或运算(1 | 1 = 1 ;0| 1 = 1; 0 | 0 = 0),相当于将第二个的参数值复制到空白的16位上。

这样就将两个参数合并了成一个参数

  • 在解析的时候,先将中间参数左移16位得到的就是1111011
  • 然后将得到的1111011右移16位,再次得到11110110000000000000000
  • 1111011000000000000000011110110000000111001000 进行异或运算(0 ^ 0 = 0; 1 ^ 1 = 0; 0 ^ 1 = 1 )

这样就完成了一个参数承载两个变量的任务了

原文地址:https://www.cnblogs.com/MaFeng0213/p/7398020.html