首页 > 其他分享 >一些位运算

一些位运算

时间:2022-11-12 11:15:22浏览次数:62  
标签:右移 运算 int 取反 long 二进制 一些

位运算

逻辑运算

& :两都为1则为1, 否则为0

| :有一为1则为1

~ :取反,将每一位都取反(符号位也取反了),因为是补码表示,所以 ~x 为 $ -x -1 $

^ :异或,两不一样时为1,否则为0

十六进制一些有用的数

\(0x3F3F3F3F\) 两倍不超过 \(int\) 能表示的最大整数;每个字节都是相同的。

\(0x7FFFFFFF\) \(int\) 能表示的最大整数,使用时注意可能有算数溢出(会成负数)

移位运算

<< :左移

>> :右移

在二进制下左移右移。

左移

二进制下同时向左移动,低位以0填充,高位越界舍去

例如:\(1 << n = 2^n\) ; \(n << 1 = 2n\)

注意 :会占符号位

如:\((1 << 31) = -2147483648\) ,因为有 \(0\) 占着 int 类型最多到 \(2^{31}- 1\) ,这种情况下如果我们想要表示 int 下最大的整数只要减一让它溢回去就行了。

右移

右移分为算术右移和逻辑右移,两者区别在于高位以什么填充

算术右移: 低位越界舍去,高位以符号位填充

逻辑右移:低位越界舍去,高位以 0 填充

现在的编译器一般都使用算术右移,算术右移的好处负数不会出问题,如 -2 逻辑右移后会是:2147483647

二进制拆分思想

二进制拆分思想最经典的应用是快速幂

int ksm(int a, int b) {
    int ans = 1;
    for (; b; b >>= 1) {
        ans = (long long) ans * a % p;
        a = (long long) a * a % p;
    }
}

二进制状压思想

将状态压成二进制数。

如:最短Hamilton路径

可以将哪些点走过了,哪些点没走过压成一个状态。

#include <bits/stdc++.h>
#define maxn 100005
using namespace std;
inline int read() {
    int x = 0, f = 1; char c = getchar();
    while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar(); }
    while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
    return x * f;
}
int G[25][25], n;
int f[1 << 21][20];
signed main() {
    n = read();
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            G[i][j] = G[j][i] = read();
    memset(f, 0x3f, sizeof(f));
    f[1][0] = 0;
    for (int i = 1; i < (1 << n); i++)
        for (int j = 0; j < n; j++) if (i >> j & 1)
            for (int k = 0; k < n; k++) if ((i ^ 1 << j) >> k & 1)
                f[i][j] = min(f[i][j], f[i ^ (1 << j)][k] + G[k][j]);
    cout << f[(1 << n) - 1][n - 1];

}

成对变化技巧

0、1; 2、3等关于 xor 1 构成成对变换。

lowbit运算

lowbit(x) = x & (-x)

标签:右移,运算,int,取反,long,二进制,一些
From: https://www.cnblogs.com/Echo-djc/p/16882929.html

相关文章

  • eclipse打开时候,发现之前的一些工程项目不见了的解决方法
    emm,最近在学习安装STS,一个springboot的插件,谁觉这个行业变化之迅速,不多学点东西,怎么混得下去(委屈),本来eclipse好好的,所以就倒腾了一番。安装插件没有安装成功,倒是eclipse默......
  • MySQL的一些认知
    MyISAM与InnoDBMyISAM的优点:1.快速查询唯一键2.支持全文索引3.选择count(*)速度快4.磁盘空间占用较少缺点:1.表级别的锁定,运用程序写入时间大于5%,表锁定会降低运用程序速度2.......
  • python中的运算符
    #1.算术运算符print('1.算术运算符')print('+1+2+3=',1+2+3)print('-10-5-1=',10-5-1)print('*2*2*3=',2*2*3)print('/7/2=',7/2)#除法,操......
  • 微积分的一些重要公式/极限/求导过程
    一些约定:本文使用弧度制,即\(\pi=180^{°}\)。对于上图,我们讨论\(\alpha\)时,称\(AB\)为\(a\),\(BC\)为\(b\),\(AC\)为\(c\)。即邻边为\(a\),对边为\(b\),斜边为......
  • 【JS】8 种 ES6 中扩展运算符的用法
    扩展操作符 … 是ES6中引入的,将可迭代对象展开到其单独的元素中,所谓的可迭代对象就是任何能用forof循环进行遍历的对象,例如:数组、字符串、Map、Set、DOM节点等。1、拷贝......
  • java中的复合赋值运算符
    本文主要阐明复合赋值运算符即i=i+1.2==>i+=1.2; inti=1;i+=1.2;System.out.println(i);//i==2注意:复合赋值运算符会进行类型转换,具体操作顺序如......
  • WinHex 可发现一些图片或文件的隐含信息
    文章内容简介:用WinHex发现图片的隐含信息一、取一张特殊的图片  我们正常打开,发现没有什么特殊的信息 二、用winhex打开  打开后,我们发现存在信息:tomisth......
  • Sqoop的简单使用案例和一些常用命令及参数
    Sqoop的简单使用案例1、导入数据在Sqoop中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传输数据,叫做:导入,即使用import关键字。1.1、RDBMS到HDFS1)确定My......
  • vue 中 ref的一些常见作用
    转:https://www.cnblogs.com/agen-su/p/11388621.html<template><div><!--vue中的ref功能很强大,介绍一下如何使用的。基本用法:本页面获取dom元素。--><div......
  • (转)Hive中JOIN的用法以及一些注意事项总结。
    原文:https://www.dandelioncloud.cn/article/details/1529381803362369537Hive表连接的语法支持如下:join_table:table_referenceJOINtable_factor[join_condition]......