两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
来源:互联网 发布:淘宝性价比高的女装店 编辑:程序博客网 时间:2024/05/17 23:33
《两个常见位操作面试题不用加减乘除运算符计算两数之和及a=b*3》
地址:http://blog.csdn.net/morewindows/article/details/8710737转载请标明出处,谢谢。
欢迎关注微博:http://weibo.com/MoreWindows
上一篇《位操作基础篇之位操作全面总结》(http://blog.csdn.net/morewindows/article/details/7354571)介绍了:
一. 位操作基础,用一张表描述位操作符的应用规则并详细解释。
二. 常用位操作小技巧,有判断奇偶、交换两数、变换符号、求绝对值。
三. 位操作与空间压缩,针对筛素数进行空间压缩。
四. 位操作的趣味应用,列举了位操作在高低位交换、二进制逆序、二进制中1的个数以及缺失的数字这4种趣味应用。
现在再来介绍两个位操作习题,这两个习题也常常在各大IT公司的笔试题面试题中出现。
1.不用加减乘除运算符计算两个数字之和
2.不用加减乘除运算符计算a = b * 3
首先这两个题目其实是很相关的,要计算
a = b * 3就是计算a = b *2 + b即a = b << 1 + b。
因此只要解决了不用加减乘除运算符计算两个数字之和,那么不用加减乘除运算符计算a = b * 3也就迎刃而解了。那么怎么不用加减乘除运算符计算两个数字之和了?我们知道在计算5 + 9时,首先不进位的话 5 + 9 = 4,5 + 9的进位为1,然后和就是1 * 10 + 4 = 14。同理放到二进制中也可以采用这样的方法。
运算步骤如下://By MoreWindows( http://blog.csdn.net/MoreWindows )
设有a = 3,b = 6。
a 0011
b 0110
不进位和 0101 = 5
进位 0010 = 2
因此 a + b就变成了5 + 2 << 1
然后有
5 0101
2<<1 0100
不进位和 0001 = 1
进位 0100 = 4
因此 a + b就变成了1 + 4 << 1
然后有
1 0001
4<<1 1000
不进位和 1001 = 9
进位 0000 = 0
当时进位为0时,不进位和为9即a + b之和。
代码不难写出:
//两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3//http://blog.csdn.net/morewindows/article/details/8710737//By MoreWindows( http://blog.csdn.net/MoreWindows )#include <stdio.h>#include <stdlib.h>#include <time.h>int BitAdd(int a, int b){int nCarry = a & b; // 进位int nSumNoCarry = a ^ b; // 非进位if (nCarry != 0)return BitAdd(nSumNoCarry, nCarry << 1);elsereturn nSumNoCarry;}int BitMultiplication3(int a){return BitAdd(a << 1, a);}int main(){printf(" 两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3\n");printf(" - http://blog.csdn.net/morewindows/article/details/8710737 -\n");printf(" - By MoreWindows( http://blog.csdn.net/MoreWindows - \n\n");srand(time(NULL));const int MAXNUMBER = 100;int a = rand() % MAXNUMBER, b = rand() % MAXNUMBER;printf("\n ------------------ 位操作之加法 --------------------\n");printf(" %d + %d = %d\n", a, b, BitAdd(a, b));printf("\n ------------------- 位操作之a = b * 3 -------------------\n");printf(" %d * 3 = %d\n", a, BitMultiplication3(a));return 0;}
运行结果如下所示:
《两个常见位操作面试题不用加减乘除运算符计算两数之和及a=b*3》
地址:http://blog.csdn.net/morewindows/article/details/8710737转载请标明出处,谢谢。
欢迎关注微博:http://weibo.com/MoreWindows
- 两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
- 两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
- 两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
- 两个常见位操作面试题:不用加减乘除运算符计算两数之和及a=b*3
- 两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
- 不用加减乘除运算符计算两数之和及a=b*3
- 不用加减乘除运算符计算两数之和及a=b*3
- 不用加减乘除运算符计算两数之和
- 371. Sum of Two Integers, 不用加减乘除运算符计算两数之和
- 【算法题】不使用加减乘除符号计算两数之和a+b
- 不用加减乘除运算符求解两个数加减乘除
- 【计算两数之和】不使用加减乘除
- 面试题---两数之和
- 两数之和a+b
- 不用比较运算符及循环控制语句,判断int型的a、b两数的大小
- 不用比较运算符及循环控制语句,判断int型的a、b两数的大小
- 不用比较运算符及循环控制语句,判断int型的a、b两数的大小
- 不用比较运算符及循环控制语句,判断int型的a、b两数的大小
- c# 关于获取exe路径
- 线性表 (一)
- 基于Cortex M3 (lpc1768)头文件 lpc17xx.h 的分析注释
- AAM算法简介
- Dive into Netbeans: Lookup
- 两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
- CF 286A(Lucky Permutation-数列找规律)
- 黑马程序员_java多线程技术
- 【推荐】WinForm开发,窗体显示与传值总结
- memset应用
- Sliding Window poj 2823
- 正整数类(项目四)
- 不能从nandflash启动原因之一
- 分布式key-Value存储