c++中>>,&运算符的使用

作者学习C语言时接触到左移/右移、按位与运算符,刷LeetCode遇到uint32_t数据类型。以计算整数二进制表示中1的个数为例,介绍解题方法。可利用n&1判断最后一位是否为1,也可用n&n - 1消去n中最后一个1。

  本人学习C语言时,了解到了<</>>(左移/右移)运算符,还有&(按位与)运算符,但是从来没有用过。刷leetcode时碰到了一个没见过的数据类型uint32_t,觉得新奇就查了一下。

放一下原题目:
  请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。

   熟悉>>,&这两个运算符的话,这个题目就不难。相信也有挺多小白像我一样,第一眼被uint32_t\color{blue}{uint32\_t}uint32_t这个数据类型吓到了。

  其实uint32_t和int差不多,int是32位,也就是四个字节的整型,uint32_t也可以理解为32位整型,区别就在于int最高位是符号位,uint32_t是无符号整型,表示范围是从0~2^32-1,在用法上,基本可以等同于int。

  那在这里直接把数据类型等同于int,这个题要怎么做呢,这就要用到标题提到的两个运算符了。

解法一:\color{red}{解法一:}:
  利用n&000···001,也就是n&1来判断最后一位是否为1,显而易见,若最低位为1,则n&1=1,反之n&1=0。

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int cnt=0;//用来记录1的个数
        while(n!=0){
            cnt++;
            n+=n&1;判断最后一位是否为1
            n>>=1;//n右移一位
        }
        return cnt;
    }
};

解法二:\color{red}{解法二:}:
  利用n&n-1来消去n中最后一个1,这里假设
   n=0010 0100
则 n-1=0010 0011
  n&n-1=0010 0000
可以看出只除去了最后一个1,其余位置不变,n等于其他值也是一样的,可以自行尝试。

 class Solution {
public:
    int hammingWeight(uint32_t n) {
        int cnt=0;//用来记录1的个数
        while(n!=0){
            cnt++;
            n+=n&n-1;//消去最后一个1
        }
        return cnt;
    }
};

  好了,文章到这里就结束了,本人也是刚刚开始刷题,很多东西也不懂,希望能和各位一起进步。最后,如果文中有错误;还请不吝赐教。

&lt;think&gt; 首先,用户的问题是:&ldquo;C++ &gt;&gt; &lt;&lt; &amp; 运算符&rdquo;,这看起来是关于C++中的运算符。用户提到了三个运算符:`&gt;&gt;`、`&lt;&lt;` 和 `&amp;`。这些是位运算符,在C++中用于位操作。 我需要用中文回答问题。回顾规则:回答完问题后,必须提出3-5个相关问题,第一行必须是&ldquo;&sect;&sect;相关问题&sect;&sect;&rdquo;,然后列出问题,禁止换行分散。 所以,我的回答应该包括: 1. 解释这些运算符。 2. 提供一些示例代码。 3. 结束时输出&ldquo;&sect;&sect;相关问题&sect;&sect;&rdquo;并列出3-5个相关问题。 运算符解释: - `&lt;&lt;`:左移运算符。将二进制位向左移动指定的位数。例如,`a &lt;&lt; b` 将a的位向左移动b位。 - `&gt;&gt;`:右移运算符。将二进制位向右移动指定的位数。例如,`a &gt;&gt; b` 将a的位向右移动b位。 - `&amp;`:按位与运算符。对两个整数的每个位执行逻辑与操作。只有两个位都为1时,结果位才为1。 这些运算符常用于低级编程、位掩码、优化等。 现在,构建回答: - 开头解释每个运算符。 - 提供简单的C++代码示例。 - 确保代码格式正确,使用```cpp```块。 - 结束时输出&ldquo;&sect;&sect;相关问题&sect;&sect;&rdquo;和3-5个相关问题。 相关问题应该基于用户的问题和我的回答。例如: 1. 这些运算符与其他运算符(如逻辑运算符)的区别? 2. 如何用这些运算符实现特定功能? 3. 性能考虑? 4. 常见错误? 5. 在STL中的应用? 最终回答结构: - 解释运算符。 - 代码示例。 - &sect;&sect;相关问题&sect;&sect; 1. ... 2. ... 3. ... 确保所有内容符合规则。 &lt;/think&gt;在C++中,`&gt;&gt;`、`&lt;&lt;` 和 `&amp;` 是位运算符,用于直接操作整数的二进制位。以下是详细解释和示例: ### 运算符说明: 1. **`&lt;&lt;`(左移运算符)**: - 将整数的二进制位向左移动指定位数,右侧空位补0。 - 语法:`value &lt;&lt; shift_count`。 - 等价于数学运算:`value * (2^shift_count)`(无溢出时)。 2. **`&gt;&gt;`(右移运算符)**: - 将整数的二进制位向右移动指定位数,左侧空位补0(无符号数)或补符号位(有符号数)。 - 语法:`value &gt;&gt; shift_count`。 - 等价于数学运算:`value / (2^shift_count)`(整数除法)。 3. **`&amp;`(按位与运算符)**: - 对两个整数的每个二进制位执行逻辑与(AND)操作:仅当两个位均为1时,结果位为1。 - 语法:`value1 &amp; value2`。 - 常用于位掩码(提取或屏蔽特定位)。 ### 示例代码: ```cpp #include &lt;iostream&gt; using namespace std; int main() { unsigned int a = 0b11001100; // 二进制: 11001100 (十进制 204) unsigned int b = 0b10101010; // 二进制: 10101010 (十进制 170) // 左移示例:a 左移 2 位 cout &lt;&lt; &quot;a &lt;&lt; 2: &quot; &lt;&lt; (a &lt;&lt; 2) &lt;&lt; &quot; (二进制: &quot; &lt;&lt; bitset&lt;8&gt;(a &lt;&lt; 2) &lt;&lt; &quot;)\n&quot;; // 输出: 816 (二进制: 1100110000) // 右移示例:a 右移 2 位 cout &lt;&lt; &quot;a &gt;&gt; 2: &quot; &lt;&lt; (a &gt;&gt; 2) &lt;&lt; &quot; (二进制: &quot; &lt;&lt; bitset&lt;8&gt;(a &gt;&gt; 2) &lt;&lt; &quot;)\n&quot;; // 输出: 51 (二进制: 00110011) // 按位与示例:a &amp; b cout &lt;&lt; &quot;a &amp; b: &quot; &lt;&lt; (a &amp; b) &lt;&lt; &quot; (二进制: &quot; &lt;&lt; bitset&lt;8&gt;(a &amp; b) &lt;&lt; &quot;)\n&quot;; // 输出: 136 (二进制: 10001000) return 0; } ``` ### 关键注意事项: - **操作数类型**:仅适用于整数类型(`int`、`char`、`unsigned` 等),浮点数无效。 - **移位安全**:移位位数应小于操作数的位宽,否则行为未定义(UB)。 - **效率**:位运算符是底层操作,通常编译为单条CPU指令,效率极高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值