前言

在工作中用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

C# 利用位运算传递多个参数方法相关推荐

  1. php 位运算与权限,PHP巧妙利用位运算实现网站权限管理的方法

    首先我们先定义4个常量来设定四种权限: ===================================== define(ADD,1);//增加数据库记录的权限 define(UPD,2);/ ...

  2. 利用位运算和指针实现的交换两个数的程序

    位运算是C语言的一大特色,利用异或运算可以实现交换两个数,原理是一个整数与另外一个数进行两次异或运算仍然是其本身,基本原理用式子表达如下: (1) A ^ A = 0; (2) A = A ^B; ( ...

  3. 利用位运算解决 N 皇后问题

    题目: LeetCode 51. N-Queens 分析: N 皇后问题是考查递归回溯的经典问题,深度优先搜索的难点在于如何剪枝,在这个问题里面的剪枝,我们需要利用额外的空间去记录当前行的有效空位,只 ...

  4. 利用位运算控制开关灯问题

    <C++笔记> 利用位运算控制开关灯问题 新手上路,可能有很多不足的地方,欢迎大家多多在留言区提出自己的观点以及更好的办法. 问题描述:俱乐部一共有32盏灯,设计一个灯光控制系统,共有4部 ...

  5. 利用位运算的模四算法

    将数列a=1,2,3,4,5,6,7...变成4,4,4,4,8,8,8,8,12,12...一个很巧妙的办法((a+3)>>2)<<2,当然不用位运算就可以用(a+3)-(a ...

  6. C语言 利用位运算实现奇校验

    编写函数,利用位运算符实现对一个数中除最高位以外的其他二进制数进行奇校验(奇校验就是在最高位的位置上加入一个值为1或为0的位,使该字节各个位中1的数量相加为奇数),并将校验位存放到最高位. 例如:×0 ...

  7. 利用位运算判断整数的正负

    挺有趣的题:给定一个整数,判断其正负,正数返回1,复数返回-1,0返回0.要求只能用位运算符和加号,且不能用循环判断等控制语句. 想到的代码是类似递归的,感觉还是挺笨的: int sign(int x ...

  8. 不用加号和减号来实现加减法(利用位运算)

    public class 加减法 {public static void main(String[] args) {System.out.println(minus(-4,-3));}public s ...

  9. 利用位运算实现加减乘除

    参考http://www.cnblogs.com/dandingyy/archive/2012/10/29/2745570.html 和 http://blog.csdn.net/hackbuteer ...

最新文章

  1. ECCV2020 Spotlight | CPN:Anchor Free,Two-stage目标检测
  2. 性能优化指南:性能优化的一般性原则与方法
  3. linux盘符改名字,Linux 下powerpath共享磁盘名称不一致处理方法
  4. 借助TensorFlow框架,到底能做什么?
  5. st官网下载stm32固件库方法
  6. JAVA——附加作业3——订阅报刊杂志
  7. Python之路【第三篇】:Python基础(二)
  8. 95-130-410-源码-source-RabbitMQ相关-RabbitMQ Connector
  9. .exe已停止工作_Windows 10累积更新KB4565503和KB4565483已发布
  10. (转)如何编写testbench的总结(非常实用的总结)
  11. Atitit  循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate).
  12. BZOJ2521[SHOI2010] 最小生成树
  13. Maven默认的生命周期
  14. caffe教程笔记《Blobs, Layers, and Nets》
  15. TK mybatis 逆向工程
  16. python计算机视觉:PIL图片格式转换
  17. java 复制excel_利用Java实现复制Excel工作表功能
  18. @guardedby同步注解
  19. linux .sh文件详解,sh命令(sh命令详解)
  20. 使用document解析xml文件

热门文章

  1. WBOLT热门关键词推荐插件v1.3.0 Pro 绿色版
  2. rtklib 天线相位中心_发射天线的作用
  3. c语言用什么操作系统,用C语言写关于操作系统的一个问题。
  4. Linux下删除mysql实例,linux下完全删除mysql
  5. call,apply学习笔记
  6. 微信表情包小程序源码-更新登录接口+增加举牌功能
  7. Linux -Ubuntu安装 Tomcat
  8. 关于Socket通信服务的心跳包(转) -感觉系统
  9. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四)实现2D人物动画①
  10. Linux Shell脚本入门教程系列之(十)Shell for循环