位运算

作者: MinoyJet | 来源:发表于2017-04-28 17:42 被阅读0次

位运算

1. 判断一个数是奇数还是偶数?

首先大家会想到是

cout << (i % 2 ? "奇数" : "偶数") << endl;

那么有没有更简单的方法呢?当然有,例如用位运算,只用比较二进制最后一位就可以了。

cout << (i & 0x1 ? "奇数" : "偶数") << endl;

2. 判断以下三段代码哪些代码输出值相同

  • 第一段:
#include <stdio.h>
int main()
{
    unsigned char a = 0xA0; /*为无符号字符型变量 a 赋值为十六进制的 A0*/
    unsigned char c = ~a; /*将 a 的取反结果赋给变量 c*/
    unsigned char b = c >> 4; /*将变量 c 右移 4 位后的结果赋给 b*/
    printf("b = %d\n", b);
    return 0;
}
  • 第二段:
#include <stdio.h>
int main()
{
    unsigned char a = 0xA0; /*定义无符号变量a并初始化,值为十六进制的A0*/
    unsigned char b = ~a >> 4; /*将 a 取反并右移 4 位的结果赋给无符号变量 b*/
    printf("b = %d\n", b);
    return 0;
}
  • 第三段:
#include <stdio.h>
int main()
{
    char a = 0xA0; /*定义变量 a 为有符号的字符型变量*/
    unsigned char b = ~a >> 4; /*将 a 取反并右移 4 位的结果赋给无符号变量 b*/
    printf("b = %d\n", b);
    return 0;
}

第一段和第三段

如果是在 32 位系统上运行程序,位运算是按 32 位计算的,而且是按照符号位进行扩展。无符号的数,在其转换的二进制数前边补 0;有符号的数,按当前符号位来补。

  • 第一段:
    a 为无符号数,a = 0xA0,a = 1010 0000。a 的取反过程为
   a = 0000 0000 0000 0000 0000 0000 1010 0000 
~a = 1111 1111 1111 1111 1111 1111 0101 1111

因为 c 为无符号数,所以 c = 0101 1111,c >> 4 = 0000 0101,因此 b = 5。

  • 第二段:
    a 为无符号数,a = 0xA0,a = 1010 0000。a 的取反过程为
   a = 0000 0000 0000 0000 0000 0000 1010 0000 
~a = 1111 1111 1111 1111 1111 1111 0101 1111

b = ~a >> 4 = 1111 0101 = 245 。

  • 第三段
    a 为有符号数,a = 0xA0,a = 1010 0000。a 的取反过程为
   a = 1111 1111 1111 1111 1111 1111 1010 0000 
~a = 0000 0000 0000 0000 0000 0000 0101 1111

b = ~a >> 4 =0000 0101 = 5 。

3. 输入一个数,实现其低 4 位翻转

#include <iostream>
#include <bitset>

using namespace std;

int main()
{
    while(1)
    {
        int i;
        cin >> i;
        cout << bitset<8>(i) << endl;
        cout << (i ^ 0xF) << endl;
        cout << bitset<8>(i ^ 0xF) << endl;
    }
}

4. 给定 int a; 计算它有多少个 bit 是 1 ?

#include <iostream>
#include <bitset>

using namespace std;

int main()
{
    while(1)
    {
        int i;
        cin >> i;
        cout << bitset<8>(i) << endl;
        cout << (i ^ 0xF) << endl;
        cout << bitset<8>(i ^ 0xF) << endl;
    }
}

或者

#include <iostream>

using namespace std;

int main()
{
    int i;
    cin >> i;
    int count;
    for (int k = 0; k < 16; k++)
    {
        if (i & 1)
            count++;
        i >>= 1;
    }
    cout << count << endl;
    return 0;
}

相关文章

  • 3、小众运算符の大课堂(一)

    较为简单の位运算符: & 位与运算| 位或运算^ 位异或运算~ 位取反运算 举例: 要做位运算,首先要把数据转...

  • 位运算及其应用

    内容概要: 位运算基本操作 基于位运算的状态压缩 位运算经典应用 位运算解N皇后问题 位运算 符号描述规则&与1&...

  • 位运算及用位运算实现权限控制

    请自行补习位运算相关知识 位运算 位运算示例 权限控制

  • 开发基础随笔之位运算符(Bitwise Operators)

    位运算符,属于算术运算符 按位逻辑运算符: 位移运算符: 位运算符的运算数只能是整数 位移运算符:按位左移 a<<...

  • 强大的位运算符

    位取反运算符 位取反运算符(~)是对所有位的数字进行取反操作位取反运算符.png 位与运算符 位与运算符(&)可以...

  • 位运算

    位运算 1. &:按位与 规律:一假则假任何位上的数和1相&得到的结果还是那个数 2. |:按位或 规律:一真则真...

  • 位运算

    https://leetcode.com/problems/gray-code/description/这个位运算...

  • 位运算

    位运算符比一般的算术运算符速度要快,而且可以实现一些算术运算符不能实现的功能。如果要开发高效率程序,位运算符是必不...

  • 位运算

    1.不用加减乘除做加法 解法:分为三步①各位相加不进位,即先按位异或;②做进位,按位与并左移位;③结果相加,直至没...

  • 位运算

    位运算不仅可以简化某些复杂的操作,而且具有更快的计算速度。典型的应用就是除法,交换两个数值,以及在一个数组中寻找只...

网友评论

      本文标题:位运算

      本文链接:https://www.haomeiwen.com/subject/gtcazttx.html