首页 > 其他分享 >位运算

位运算

时间:2023-03-18 15:14:41浏览次数:22  
标签:count 运算 int lowbit 二进制 数列

n的二进制表示中第k位是几

思想

  • 先把第k位移到最后一位

    实现方式是用右移运算 n >> k

  • 再看最低位是几

    假设前一步得到x, 最低位为 x & 1

代码

# include<iostream>

using namespace std;

int main() {
    int n, k;
    cin >> n >> k;
    
    int res = n >> k & 1;  // 注意 k = 0 就是第 0 位
    cout << res;
    return 0;
}

lowbit(x)

lowbit(x)是x的二进制表达式中最低位的1所对应的值, 是树状数组的一个基本操作

举个例子

\(x = (1010)_2\) 则 \(lowbit(x) = (10)_2\)

\(x = (101000)_2\) 则 \(lowbit(x) = (1000)_2\)

思想

\(lowbit(x) = x \& (-x)\)

拿上面的例子一来看 \(x = (0 000 1010)_2, -x = (11110110)_2\)

解释一下为什么, 在存储过程中是补码, 最高位为符号位, 在与运算时符号位也会参与运算

上面相与得到 \((00001010)_2 \& (11110110)_2 = (00000010)_2\)

又有 \((-x) = {\sim}x + 1\) ~是非运算比如 \(x = (0 000 1010)_2, {\sim}x = (11110101)_2\)

代码

# include <iostream>

using namespace std;

int lowbit1(int x) {
    return x & (-x);
}

int lowbit2(int x) {
    return x & (~x + 1);
}

int main()
{
    int x;
    cin >> x;
   	cout << lowbit1(x) << endl << lowbit2(x);
}

应用

求x二进制表示中1的个数

题目

给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。

输入格式

第一行包含整数 n。

第二行包含 n 个整数,表示整个数列。

输出格式

共一行,包含 n个整数,其中的第 i个数表示数列中的第 i 个数的二进制表示中 1的个数。

数据范围

\(1≤n≤100000\)
\(0≤数列中元素的值≤10^9\)

输入样例:

5
1 2 3 4 5

输出样例:

1 1 2 1 2
代码
# include<iostream>

using namespace std;

int lowbit(int x) {
    return x & (-x);
}

int count_one(int x) {
    int  count = 0;
    while(x != 0) {
        x -= lowbit(x);
        count ++;
    }
    return count;
}

int main(){
    int n, x;
    cin >> n;
    for(int i = 0; i < n; i ++){
        cin >> x;
        cout << count_one(x) << " ";
    }
}

标签:count,运算,int,lowbit,二进制,数列
From: https://www.cnblogs.com/wojiuyishui/p/17230657.html

相关文章

  • 数据类型转换、运算符
    day02数据类型太简单,没啥写的,略注意:空串""是长度为0的字符串。空串是一个Java对象,有自己的串长度(0)和内容(空)。不过,String变量还可以存放一个特殊的值,名为null,这表示目前......
  • java运算符
    一表达式表达式由运算符和操作数组成如:5num1,num1+num2,sum=num1+num2二运算符1.算术运算符算术运算符主要用于进行基本的算术运算,如加法,减法,乘......
  • 输入一个字符串(例如:3+6-3*4/2,运算符只有 + - * / 四个),计算结果。不考虑加减乘除优先级
    这是自己面试遇到的面试题,考Java基础,String。考的很基础,但是String确实java中很重要的基础部分。题目:输入一个字符串(例如:3+6-3*4/2,输出12。运算符只有+-*/四个),计算......
  • 位运算
    C.TheVeryBeautifulBlanket2023-03-1719:13:29性质:两个相同的数异或等于0用类似的性质例如000000011100000011100000010000000010构造这样的四个数c++#i......
  • C 语言运算符优先级
    说明:同一优先级的运算符,运算次序由结合方向所决定。简单记就是:!>算术运算符>关系运算符>&&>||>赋值运算符......
  • 利用位运算加速计算
    整除2与模2x:int=123#整除2:x=x>>1#模2:x=x&1x&(x−1)(BrianKernighan算法)对于任意整数x:int,令x=x&(x−1),该运算将x的二进制表示的最后一个1变......
  • Java中的BigDecimal运算
    BigDecimal是Java中的一个高精度数值类型,它可以用于处理需要高精度计算的场景,例如财务计算。在进行加减乘除运算时,BigDecimal提供了多种方法。下面是几个示例:1.加法Big......
  • 按位运算符
    按位运算符指定a=60(00111100);b=13(00001101)按位与(&)对两个数进行操作,然后返回一个新的数,这个数的每个位都需要两个输入数的同一位都为1时才为1,如下图:(a&b)结......
  • 位运算
    位运算1位逻辑运算符:&(位“与”)and^(位“异或”)|(位“或”)or~(位“取反”)2移位运算符:<<(左移)>>(右移)优先级位“与”、位“或”和位“异或”运算符都是双目......
  • 【Java笔记5】运算符
    @目录一.算术运算符二.赋值运算符三.比较运算符四.逻辑运算符五.三元运算符六.运算符的优先级七.字符串拼接字符串字符串拼接运算一.算术运算符运算符说明......