首页 > 编程语言 >C++面试八股文:了解位运算吗?

C++面试八股文:了解位运算吗?

时间:2023-06-12 22:37:12浏览次数:41  
标签:面试官 八股文 int unsigned 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++!(狗头)

标签:面试官,八股文,int,unsigned,C++,取反,面试,师兄
From: https://www.cnblogs.com/binarch/p/17476261.html

相关文章

  • 你可能需要一个面试指导
    作为一名从业多年的高级Java讲师,我热衷于帮助学习者在Java编程领域获得更好的发展。在本篇博客中,我将提供一些面试指导,以及经验总结等首先,让我们来谈一谈面试。对Java开发人员来说,面试是未来职业机会获得的重要途径。以下是一些我建议您遵循的面试技巧:1.熟悉Java编程语言基础知......
  • hvv面试常见框架漏洞问题合集
    1.thinkphp特征判断直接在url后加/?s=1whatweb进行探测,方式:whatwebURL漏洞5.0RCE原理thinkphp底层没有对控制器名进行很好的合法性校验,导致在未开启强制路由的情况下,没有对""进行过滤,用户可以调用任意类的任意方法,最终导致远程代码执行漏洞的产生thinkPHP5SQL注入......
  • c++ create daemonizeMe
    daemonizeMe//Copyright(c)2017DeepAggarwal#include<getopt.h>#include<grp.h>#include<pwd.h>#include<stdlib.h>#include<syslog.h>#include<sys/stat.h>#include<sys/types.h>#include<unistd.h>#include......
  • C++采用Daemon进行后台程序的部署
    文章目录一、如何采用Daemon进行后台程序的部署1.创建子进程2.终止父进程3.创建新的会话4.改变当前工作目录5.重设文件权限掩码6.关闭不需要的文件描述二.代码示例 一、如何采用Daemon进行后台程序的部署在C++中,如果要让一个程序一直在后台运行并且和......
  • 【C++】STL常用容器总结之十二:string类
    13、string类声明string类本不是STL的容器,但是它与STL容器有着很多相似的操作,因此,把string放在这里一起进行介绍。之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完......
  • c++中string类的源代码
    一:回顾(1)c++中的string类是在面试中和笔试中经常考的题目;工程代码免费下载 string类的自行实现(2)c++中的string类和fstream类合起来是处理外部数据的利器;(3)string类经常用到findfind_first_offind_first_not_offind_last_offind_last_not_ofsubstrreplace等,以及联合使用来达......
  • C++ operator关键字(重载操作符)
    operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。  这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)......
  • C++ 运算符重载讲解与经典实例
    C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作。例如: classcomplex{public:complex(doubler=0.0,doubleI=0.0){real=r;imag=I;}voiddisplay();private:doublereal;doubleimag;};comple......
  • 最近面试题
    面试题1.业务流程的测试点2.考虑哪些异常场景3.余额怎么看4.余额存在网站上吗?5.产品出货你关吗?6.自动化怎么做的7.文本会检查哪些东西8.有没有检查过数据库9.做自动化时不会自动检查数据库吗?10.接口测试测什么11.怎么考虑接口案例12.接口案例是自己设计的吗?13.检查接......
  • C++面试八股文:如何在堆上和栈上分配一块内存?
    C++面试八股文:如何在堆上和栈上分配一块内存?某日二师兄参加XXX科技公司的C++工程师开发岗位6面:面试官:如何在堆上申请一块内存?二师兄:常用的方法有malloc,new等。面试官:两者有什么区别?二师兄:malloc是向操作系统申请一块内存,这块内存没有经过初始化,通常需要使用memset手......