C++面试八股文:了解位运算吗?
某日二师兄参加XXX科技公司的C++工程师开发岗位第12面:
面试官:了解位运算吗?
二师兄:了解一些。(我很熟悉)
面试官:请列举以下有哪些位运算?
二师兄:按位与(
&)、按位或(|)、按位异或(^),按位取反(~)、左移(<<)和右移(>>)。面试官:好的。那你知道位运算有什么优势吗?
二师兄:优势主要有两点:1.速度快。2.节省寄存器/内存空间。
面试官:在C++中,如何处理
int型负数最高位(是1)的左移或者右移?二师兄:不同编译器处理的方法不同。此操作在C++中属于未定义的行为。所以不要使用带符号的整数参加位运算。
面试官:如何判断一个数是不是
2的整数次方?二师兄:使用这个数与这个数-1按位与,如果结果是0,则这个数是2的整数次方,否则不是。
bool is_power_of_two(unsigned int n)
{
return n & (n-1) == 0;
}
面试官:如何使用位运算交换两个数,而不能申请额外的空间?
二师兄:可以使用异或操作,原理是一个数异或两次同一个数,结果等于原值。
void swap(unsigned int& a, unsigned int& b)
{
a = a ^ b; // a = a ^ b;
b = a ^ b; // b = a ^ b ^ b = a;
a = a ^ b; // a = a ^ b ^ a = b;
}
面试官:如何获取一个数字中的某一位是
0还是1?二师兄:把这个数字右移
x位,然后与&1。
bool get_bit(unsigned int n, unsigned int x)
{
return 1 & (n >> x);
}
面试官:如何将一个数的某一位置成
1/置成0,或取反?二师兄:沉思良久。。。想不起来了。。。
今日二师兄的表现还不错,除了最后一问,其他都答上来了。让我们看看最后一问吧:
如何将一个数的某一位置成0/置成1,或取反?
先看第一个,如何将一个数的某一位置成1?这个数的这一位要不是1要不是0,最终要变成1,那么可以考虑在这一位上构造个1,然后和这个数或,这一位就置成了1。
unsigned set_bit_1(unsigned int n, unsigned int x)
{
return (1u << x) | n;
}
如何将一个数的某一位置成0呢?我们首先考虑到与(&)操作。同样我们需要构造出来一个全是1的数字,然后再这一位上变成0,并与传入的参数进行与操作:
unsigned set_bit_0(unsigned n, unsigned x)
{
return (~(1u << x)) & n;
}
最后一个问题,如果讲一个数的某一位取反?想到了取反,我们就想到了异或。任何数与1异或等于取反,任何数与0异或等于原数:
unsigned flip_bit(unsigned n, unsigned x)
{
return (1u << x) ^ n;
}
好了,今日份面试到这里就结束了。二师兄自我感觉表现还行,晚上给自己加了个鸡腿。
关注我,带你走进二师兄的跌宕起伏的C++面试生涯。
关注我,带你21天“精通”C++!(狗头)
C++面试八股文:了解位运算吗?的更多相关文章
- 面试必备:高频算法题终章「图文解析 + 范例代码」之 矩阵 二进制 + 位运算 + LRU 合集
Attention 秋招接近尾声,我总结了 牛客.WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对.测试.欢迎食用 本 ...
- 《面试八股文》之 JVM 20卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. <面试八股 ...
- Java中的位运算
昨天去面试的时候做到了一道Java的位运算题目,发现有个运算符不懂:">>>",今天特地查了一下,并小结一下常见的位运算符号: ~ 按位非(NOT)(一元运算) ...
- [c/c++] programming之路(30)、位运算(一)
一.取反 ~ #include<stdio.h> #include<stdlib.h> void main(){ unsigned ; //0000 1111 char的单位是 ...
- jave 逻辑运算 vs 位运算 + Python 逻辑运算 vs 位运算
JAVA中&&和&.||和|(短路与和逻辑与.短路或和逻辑或)的区别 博客分类: 面试题目 Java.netBlog 转自 :http://blog.csdn.net/web ...
- LeetCode137只出现一次的数字——位运算
题目 题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现三次.找出那个只出现一次的元素. 说明:你的算法应该具有线性时间的复杂度.你可以不使用额外的空间来实现吗? 思路 题 ...
- Java 位运算超全面总结
1.原码.反码.补码 关于原码.反码.补码的相关知识作者不打算在这里长篇大论,相关知识已有别的大佬总结很好了,还请老铁自行 Google,不过有篇知乎回答是作者学编程以来见过对相关知识最通俗易懂,生动 ...
- 《面试八股文》之kafka21卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是moon,最新一篇面试八股文系 ...
- Python这些位运算的妙用,绝对让你大开眼界
位运算的性能大家想必是清楚的,效率绝对高.相信爱好源码的同学,在学习阅读源码的过程中会发现不少源码使用了位运算.但是为啥在实际编程过程中应用少呢?想必最大的原因,是较为难懂.不过,在面试的过程中,在手 ...
- 负数位运算的右移操作-C语言基础
这一篇探讨的是"负数位运算的右移操作",涉及到数据的源码.反码.补码的转换操作.属于C语言基础篇. 先看例子 #include <stdio.h> int main(v ...
随机推荐
- 2020寒假学习笔记15------Spark基础实验
今天又开始重新做实验六,第一题做的比较顺利,运行结果如下: 等到第二题就出现了各种各样的错误,开始运行telnet localhost 44444命令时出现bash: telnet: command ...
- 机器学习系列入门系列[七]:基于英雄联盟数据集的LightGBM的分类预测
1. 机器学习系列入门系列[七]:基于英雄联盟数据集的LightGBM的分类预测 1.1 LightGBM原理简介 LightGBM是2017年由微软推出的可扩展机器学习系统,是微软旗下DMKT的一个 ...
- vue2双向绑定原理及源码解析
首先我们要知道VUE实现双向绑定的步骤是什么: 实现一个监听器 Observer 对数据对象进行遍历,包括子属性对象的属性,利用 Object.defineProperty() 对属性都加上 sett ...
- vue cli3中配置生产环境、开发环境、测试环境
首先在packjson中配置 "scripts": { "serve": "vue-cli-service serve", //调用开发ap ...
- Edge解决默认Bing搜索跳转到国内版的问题
近期BingGPT申请通过以后,每次用PC端Edge去跳转的时候不管是否念Proxy咒都会进入国内版本Bing,排查得到默认Bing参数如下 因此,在edge://settings/searchEng ...
- 端口转发、Http Tunnel、内网穿透
原文链接:https://www.yuque.com/tec-nine/architecture/mgxc71 SSH 命令帮助 命令行选项有: -a 禁止转发认证代理的连接. -A 允许转发认证代理 ...
- easy-excel读取远程地址获得文件进行上传
背景 作为一个快五年的程序员,一直以来还没有自己维护过自己的技术栈,最近也是有时间,所以也是下定决心,从头开始,一步一步的夯基础.最近在系统化的学习easy-excel,今天遇到了一个问题,特意记录一 ...
- 在Kubernetes上安装Netdata的方法
介绍 Netdata可用于监视kubernetes集群并显示有关集群的信息,包括节点内存使用率.CPU.网络等,简单的说,Netdata仪表板可让您全面了解Kubernetes集群,包括在每个节点上运 ...
- MINIO搭建单机以及集群
MINIO简介 Minio是Apache License v2.0下发布的对象存储服务器.它与Amazon S3云存储服务兼容.它最适合存储非结构化数据,如照片,视频,日志文件,备份和容器/VM映像. ...
- LeeCode 二叉树问题(四)
二叉搜索树的应用问题 二叉搜索树的定义 若左子树不空,则左子树上所有节点的值均小于根节点的值 若右子树不空,则右子树上所有节点的值均大于根节点的值 它的左右子树也均为二叉搜索树 中序遍历结果为一个升序 ...