热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

lintCode第一题A+B问题

http:www.lintcode.comzh-cnproblema-b-problem问题:给出两个整数a和b,求他们的和,但不能使用+等数学运算符。注意事项你不需要从输入流读入

coding

http://www.lintcode.com/zh-cn/problem/a-b-problem/ 问题: 给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。 注意事项 你不需要从输入流读入数据, 只需要根据aplusb的两个参数a和b, 计算他们的和并返回就行。 您在真实的面试中是否遇到过这个题? 说明 a和b都是 32 位 整数么? 是的 我可以使用位运算符么? 当然可以 样例 如果 a = 1 并且 b = 2, 返回3 涉及知识点: Javascript中的位操作符,参考资料 Javascript高级程序设计

  1. 按位非(NOT) 按位操作的本质:操作数的负值减1。用~表示
  2. 按位与(AND) (&)表示。两个操作数先转为二进制,比较二进制中的每一位数,如果两个都是1,则返回1。其中任何一位是0,结果都是0 例如: var result = 25&3; 底层操作为:(最后8位) 25:0001 1001 3:0000 0011 &:0000 0001 返回 1
  3. 按位或(OR) (|)表示。两个操作数先转为二进制,比较二进制中的每一位数,如果有一个位是1的情况下返回1,而只有在两个位都是0的情况下才返回0 例如: var result = 25|3; 底层操作:(最后8位) 25: 0001 1001 3: 0000 0011 |: 0001 1011 返回27
  4. 按位异或(XOR) (^)表示。 两个操作数先转为二进制,比较其中的每一位数,只有两个数值对应位上只有一个1是才返回1,否则返回0,即两位都是1或都是0的情况下,返回0 例如: var result = 25^3; 底层操作:(最后8位) 25: 0001 1001 3: 0000 0011 ^: 0001 1010 返回26
  5. 左移 (<<)表示。这个操作符会将所有位向左移动指定的位数。 例如: var oldValue = 2; var newValue = oldValue<<5; 底层操作:(最后8位) oldValue: 0000 0010 newValue: 0100 0000 返回64
  6. 有符号的右移 (>>)表示。操作符会将数值向右移动,并保留符号位(即正负号标记)。与上个例子相反
  7. 无符号右移 (>>>)表示。 这个操作符会将数值的所有32位都向右移动。正数无符号右移和有符号右移相同。负数为,这个数先取反再向右移,右移的空位由0来填充

分析: 例如 7+18 十进制 7+18 首先不考虑进位 为 7+8,得到5.第二步考虑进位 进位为1,得到10.结果相加为25 同理二进制也是按这个方法 二进制: 7: 0000 0111 11:0001 0010

  1. 7的二进制与11的二进制相加不考虑进位 即 0001 0101.
  2. 考虑进位的问题 0000 0010 因为只有最后两位进位,所以向左移动一位 0000 0100
  3. 再次调用第一个步骤 0001 0101 与 0000 0100 相加不考虑进位: 0001 0001
  4. 调用第二步 只有 0000 0100 发生了进位 向左移动一位 0000 1000
  5. 在调用第一步 0001 0001 与 0000 1000 相加 0001 1001 进位为0 结果转为十进制为25

具体代码:

const aplusb = function (a, b) {

let sumX = 0

let sumY = 0

do {

sumX = a ^ b

sumY = (a & b) <<1

a = sumX

b = sumY

console.log(a, b)

} while (sumY !== 0)

return sumX

}

console.log(aplusb(7, 18))//测试代码


推荐阅读
  • 本文探讨了如何在Node.js环境中,通过Tor网络使用的SOCKS5代理执行HTTP请求。文中不仅提供了基础的实现方法,还介绍了几种常用的库和工具,帮助开发者解决遇到的问题。 ... [详细]
  • 本文探讨了如何解决在使用CoffeeScript定义类时,实例化后对象为空的问题,并提供了解决方案。 ... [详细]
  • 本文详细介绍了如何在Linux系统中安装和配置Node.js,包括从官方下载、编译安装到运行基本示例的全过程。 ... [详细]
  • Node.js中子进程的创建与管理详解
    本文深入探讨了Node.js中如何使用child_process模块来创建和管理子进程,包括exec、spawn和fork三种方法的具体应用及其实现细节。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • Node.js 入门指南(一)
    本文介绍了Node.js的安装步骤、如何创建第一个应用程序、NPM的基本使用以及处理回调函数的方法。通过实际操作示例,帮助初学者快速掌握Node.js的基础知识。 ... [详细]
  • Node.js 中 GET 和 POST 请求的数据处理
    本文详细介绍了如何在 Node.js 中使用 GET 和 POST 方法来处理客户端发送的数据。通过示例代码展示了如何解析 URL 参数和表单数据,并提供了完整的实现步骤。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
  • 本文详细介绍了 Node.js 中 Worker.isMainThread 属性的功能、用法及其实例代码,帮助开发者更好地理解和利用多线程技术。 ... [详细]
  • 本文档详细介绍了在 Kubernetes 集群中部署 ETCD 数据库的过程,包括实验环境的准备、ETCD 证书的生成及配置、以及集群的启动与健康检查等关键步骤。 ... [详细]
  • 本文详细介绍了如何在Linux系统中安装和配置GitLab Runner,包括添加YUM源、安装GitLab Runner以及注册Runner的具体步骤。 ... [详细]
  • 本文深入探讨了 Prototype.js 框架及其与 JavaScript 原生 toString() 方法之间的区别,适合对前端开发感兴趣的开发者阅读。文章将帮助读者理解两者在功能实现和应用场景上的不同,从而更好地利用这些工具进行高效编程。 ... [详细]
  • MQTT协议:轻量级消息传输的基石
    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种基于发布/订阅模式的轻量级通信协议,适用于低带宽、高延迟或不可靠的网络环境。该协议基于TCP/IP构建,由IBM在1999年首次推出,旨在通过最小化网络流量和代码量,为远程设备提供高效、可靠的消息传输服务。 ... [详细]
  • Node.js 开发入门:环境搭建与配置
    随着Node.js技术的日益成熟及其即将发布的1.0稳定版,越来越多的开发者开始关注并尝试这一高性能的服务器端JavaScript平台。本文将引导读者如何在Windows环境下安装配置Node.js,并介绍一些常用的开发工具和框架。 ... [详细]
author-avatar
cuijunhao456_715
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有