从零学算法(加密运算)

2023-09-22 11:56:32

加密运算.计算机安全专家正在开发一款高度安全的加密通信软件,需要在进行数据传输时对数据进行加密和解密操作。假定 dataA 和 dataB 分别为随机抽样的两次通信的数据量:
正数为发送量
负数为接受量
0 为数据遗失
请不使用四则运算符的情况下实现一个函数计算两次通信的数据量之和(三种情况均需被统计),以确保在数据传输过程中的高安全性和保密性。
示例 1:
输入:dataA = 5, dataB = -1
输出:4

  • 实际上这就是不能用四则运算实现加法。那么我们肯定是要先枚举查看各种情况和什么位运算比较符合。将两个数转为二进制后,最后一位分别为 0 或 1,有四种配对可能性(类似数字电路真值表),由于会两个 1 相加会进位,所以我们把结果的和分为不进位n和以及进位和c(不算权重)
a b n c
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1
  • 如果不习惯可以看成比如十进制的 8 和 9 相加,会得到 n 为 7,c 代表了进位的 1,由于是十进制,所以实际上表示 1 x 10 = 10,你会发现 a + b 就这样被转换成了 n + c(该例子应该很好理解,两个个位数相加,结果就是和的个位+十位)
  • 根据规律发现 n 为 a^b ,c 为 a&b ,由于权重问题所以 c 实际上是 (a&b)<<1。所以我们不断将 a,b 更新为 n,c 进行累加即可,建议举个例子计算一遍,观察 ab 的变动,比如 8+9,你会发现能够得到 2 的 n 次 c,c 为小于 17 的最大的 2 的 n 次 16,n 为 1。
  •   public int add(int a, int b) {
          while(b != 0) { // 当进位为 0 时跳出
              int c = (a & b) << 1;  // 暂存进位和,c = 进位
              a ^= b; // a = 非进位和,a 更新为 n
              b = c; // b = 进位,b 被操作完了,可以更新为 c 了
          }
          return a;
      }
    
  • 或者写成递归版本
  •   public int add(int a, int b) {
          if(b == 0) return a;
          if(a == 0) return b;
          return add(a^b, (a&b)<<1);
      }
    
更多推荐

spring boot 整合多数据源

多数据源产生的场景一般情况下,不会有多数据源这样的场景出现,但老项目或者特殊需求的项目,可能会有这样的场景同一个应用需要访问两个数据库不用数据库中间件的读写分离注入数据源选择的时机声明两个数据源实例,在getConnection的时候根据业务的不同,注入不同数据源的连接环境准备准备sql脚本,建立两个库,这里mysql

java使用正则提取数据

一、正则提取文本指定数据需要对一个json结构做数据的提取,提取label和value的值,组成新的结构,西瓜:0、苹果:1、草莓:2原始json字符串如下格式[{"label":"西瓜","value":0},{"label":"苹果","value":1},{"label":"草莓","value":2},{"la

LeetCode2.两数相加

一看完题,我的想法是先算出这两个链表表示的数,然后相加,然后把这个数一位一位的分配给第三个数组,这种方法应该很简单但是要遍历三次数组,于是我就想直接一遍遍历,两个链表同时往后面遍历,把这两个数的和给第三个链表,如果有进位,下一个数加1;但是写完之后出现的问题,因为我的循环是先创建下一个链表然后,指针指向这个链表,然后再

AI绘图软件Stable Diffusion 安装和使用之二controlnet插件

本期说一下StableDiffusion非常有名的插件controlnet。同上一篇一样,我们安装b站大佬秋葉aaaki(有的网友戏称他/她是赛博佛祖)的stablediffusion4.2整合包。解压缩以后,打开启动器,见下图,界面比早期版本更好看了。​编辑​启动器打开以后,安装controlnet插件填写网址:ht

【文生图系列】如何在Stable Diffusion Webui中使用ControlNet

文章目录ControlNetStableDiffusion+ControlNet安装ControlNet插件bug例子展示参考ControlNetControlNet是一个神经网络结构,通过添加额外的条件控制扩散模型。给定任务条件,ControlNet能够提升已训练好的图像扩散模型。对于任意一个神经网络块,如下图所示,

【面试经典150 | 数组】跳跃游戏 II

文章目录写在前面Tag题目来源题目解读解题思路方法一:贪心写在最后写在前面本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:Tag:介绍本题牵涉到的知识点、数据结构;题目来源

软件测试/测试开发丨利用人工智能ChatGPT编写晋级报告

点此获取更多相关资料简介不管是在哪个公司,如果想要有一个长足的发展,想要获得晋升,除了平时的表现与积累,还有就是晋级答辩与晋级报告。不同的岗位,比如设计、产品、研发、测试,都有不同的答辩通道和晋级标准。一篇好的晋级报告,可以完整地体现一个人过去的工作贡献,以及未来的工作展望。而晋级报告的编写,也可以借助ChatGPT轻

微信CRM系统致力于帮助金融保险行业

在当今信息化的时代,金融保险行业面临着越来越大的竞争与挑战,那么微信CRM系统是怎么帮助金融保险行业解决问题的呢?金融保险行业面临的困难①销售管理困难,企业资源容易流失;金融保险业通过在线销售实现业务。电话销售、微信沟通难以监控管理,销售部员工流动性大,导致监管风险和客户资源流失。②客户营销困难,用户意向定位模糊;由于

《golang设计模式》第二部分·结构型模式-06-享元模式(Flyweight)

文章目录1.概述1.1角色1.2类图2.代码示例2.1设计2.2代码2.3类图示例1.概述享元(Flyweight)模式采用共享方式向客户端提供数量庞大的细粒度对象。所谓细粒度对象,是指实现了业务细节并相互独立的对象。细粒度对象是一种相对概念,一般不会进行更小粒度的拆分。1.1角色抽象享元(Flyweight):通常是

【跟小嘉学 Rust 编程】三十、Rust 使用 Slint UI

系列文章目录【跟小嘉学Rust编程】一、Rust编程基础【跟小嘉学Rust编程】二、Rust包管理工具使用【跟小嘉学Rust编程】三、Rust的基本程序概念【跟小嘉学Rust编程】四、理解Rust的所有权概念【跟小嘉学Rust编程】五、使用结构体关联结构化数据【跟小嘉学Rust编程】六、枚举和模式匹配【跟小嘉学Rust

(vue2)面经基础版-案例效果分析

配路由先配一级,一级里面配二级。一级路由:首页(二级:嵌套4个小页面)、详情页高亮a->router-link,高亮效果对自带高亮类名router-link(-exact)-active设置注:通过children配置项,可以配置嵌套子路由。并在该组件中准备路由出口<router-view></router-view>

热文推荐