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

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

时间:2023-06-17 23:55:37浏览次数:46  
标签:面试官 八股文 int unsigned C++ 取反 面试 异或 师兄

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;
}

好了,今日份面试到这里就结束了。二师兄自我感觉表现还行,晚上给自己加了个鸡腿。

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

相关文章

  • 《C++》继承
    继承classA:publicB子类:继承方式父类classPhone{public: Phone() { frame="框架"; screen="屏幕"; battery="电池"; }public: stringframe; stringscreen; stringbattery;};classBrand:publicPhone{public: Brand(strin......
  • 疫情三年后的今天-面试体会(沪)
      今天是2023年6月17号22:01>       过去好久又来到了博客。不知道这几年在做些什么,浑浑噩噩几年过去了。不知不觉也将立家立业的年纪了。跟父母去沟通,去了解各种生活场景,尽显出各自环境所产生的无奈与悲凉。也有幸福和快乐。  人生路漫漫,要学会感恩......
  • C++面试八股文:聊一聊指针?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第17面:面试官:聊一聊指针?二师兄:好的。面试官:你觉得指针本质上是什么?二师兄:这要从内存地址开始说起了。如果有一块容量是1G的内存,假设它的地址是从0x00000000到0x3fffffff,每一个字节都对应一个地址。当我们声明一个变量并初始化它......
  • C++面试八股文:聊一聊指针?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第17面:面试官:聊一聊指针?二师兄:好的。面试官:你觉得指针本质上是什么?二师兄:这要从内存地址开始说起了。如果有一块容量是1G的内存,假设它的地址是从0x00000000到0x3fffffff,每一个字节都对应一个地址。当我们声明一个变量并初始化......
  • C++增删改查+MySQL
    右键项目属性 点击编辑 选择mysql安装目录的include文件夹 包含了头文件之后包含库文件 点击编辑在mysql安装路径下面选择  选择编辑之后添加看这个文件下面有没有这个输入的文件依赖 有就代表成功连接数据库 创建数据库:createdatabasestudent_mana......
  • react经典面试题解析--持续更新--day01
    一、类组件和函数组件的区别(面试常考)简单理解(所有同学都要掌握)1、类组件有生命周期,函数组件没有2、类组件需要继承Class,函数组件不需要3、类组件可以获取实例化的this,并且基于this做各种操作,函数组件不行4、类组件内部可以定义并维护state,函数组件都称为无状态了,那肯定......
  • GESP-C++-4
    GESPC++四级样题卷在C++中,指针变量的大小(单位:字节)是()A.2B.4C.8D.与编译器有关答案:D以下哪个选项能正确定义一个二维数组()A.inta[][];B.charb[][4];C.doublec[3][];D.boold[3][4];答案:D在C++中,以下哪种方式不能用于向函数传递参数()A.值传递B.......
  • GESP-C++-3
    GESPC++三级样题卷下列关于负数的原码、反码、补码的描述中,正确的是()A.原码和反码互为按位取反(符号位除外),补码为反码加1B.原码和反码互为按位取反(符号位除外),补码为原码加1C.反码和补码互为按位取反(符号位除外),原码为反码加1D.补码和原码互为按位取反(符号位除外),反......
  • 【C++】值初始化
    如果自己建一个类,例如:classA{public:A(){cout<<"A"<<endl;}inti;};在main主函数中如下的两行代码:A*pa1=newA;A*pa2=newA();效果一样,都是调用A的构造函数,也就是说,自己定义的类,在new该类的对象时,所谓的值初始化是没有意义的。所......
  • GESP-C++-2
    GESPC++二级样题卷人们在使用计算机时所提到的Windows通常指的是()。A.操作系统B.多人游戏C.上市公司D.家居用具答案:A万维网WWW中存储了海量的数据资源,这里用于传输控制的协议是()。A.URLB.SMTPC.HTTPD.HTML答案:C下列关于C++语言的叙述,不正确的是()......