C++面试八股文之位运算问题详解

 更新时间:2023年06月13日 08:45:33   作者:二进制架构  
这篇文章主要为大家介绍了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++位运算面试的资料请关注脚本之家其它相关文章!

相关文章

  • C++应用实现简易五子棋游戏

    C++应用实现简易五子棋游戏

    这篇文章主要为大家详细介绍了C++应用实现简易五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C++如何向Lambda传递参数与捕获

    C++如何向Lambda传递参数与捕获

    文章介绍了C++中向Lambda表达式传递参数和使用捕获列表的基本规则和示例,参数传递要求严格匹配类型和数量,而捕获列表允许Lambda访问外部变量,并可以按值或引用捕获,文章还讨论了捕获的陷阱和解决方案,以及参数传递与捕获列表的区别和应用场景,感兴趣的朋友一起看看吧
    2025-03-03
  • C++ 基本数据类型中int、long等整数类型取值范围及原理分析

    C++ 基本数据类型中int、long等整数类型取值范围及原理分析

    这篇文章主要介绍了C++ 基本数据类型中int、long等整数类型取值范围及原理分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++继承与菱形继承详细介绍

    C++继承与菱形继承详细介绍

    继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程
    2022-08-08
  • C++中变量进行初始化的3种方法

    C++中变量进行初始化的3种方法

    本文主要介绍了C++中变量进行初始化的3种方法,包括用"=",构造函数初始化以及统一初始化这三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,着小编来一起学习学习吧
    2024-02-02
  • C语言中的结构体快排算法

    C语言中的结构体快排算法

    这篇文章主要介绍了C语言中的结构体快排算法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C语言sizeof与字符串处理与动态内存分配及main函数参数详解

    C语言sizeof与字符串处理与动态内存分配及main函数参数详解

    这篇文章主要介绍了C语言字符串处理函数、sizeof、动态内存分配函数、main函数参数问题,static在修饰变量的时候,如果是修饰全局变量,则跟全局变量功能一样,通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • C语言实现飞机大战小游戏

    C语言实现飞机大战小游戏

    这篇文章主要为大家详细介绍了C语言实现飞机大战小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 详谈C++的内存泄漏问题

    详谈C++的内存泄漏问题

    下面小编就为大家带来一篇详谈C++的内存泄漏问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • C++实现简易通讯录管理系统

    C++实现简易通讯录管理系统

    这篇文章主要为大家详细介绍了C++实现简易通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06

最新评论