位运算

【UVA 509 --- RAID!】模拟+位运算

怎甘沉沦 提交于 2020-02-12 21:16:24
【UVA 509 --- RAID!】模拟+位运算 题目来源: 点击进入【UVA 509 — RAID!】 Description RAID (Redundant Array of Inexpensive Disks) is a technique which uses multiple disks to store data. By storing the data on more than one disk, RAID is more fault tolerant than storing data on a single disk. If there is a problem with one of the disks, the system can still recover the original data provided that the remaining disks do not have corresponding problems. One approach to RAID breaks data into blocks and stores these blocks on all but one of the disks. The remaining disk is used to store the parity information for the

位运算和enum中的位运算

只愿长相守 提交于 2020-02-12 11:25:48
1、 位逻辑非运算   ~ 位逻辑非运算是单目的,只有一个运算对象。位逻辑非运算按位对运算对象的值进行非运算,即:如果某一位等于0,就将其转变为1;如果某一位等于1,就将其转变为0。 比如,对二进制的10010001进行位逻辑非运算,结果等于01101110,用十进制表示就是: ~145等于110;对二进制的01010101进行位逻辑非运算,结果等于10101010。用十进制表示就是~85等于176。 2 、位逻辑与运算   & 位逻辑与运算将两个运算对象按位进行与运算。与运算的规则:1与1等于1,1与0等于0,0与0等于0。 只有 1&1 = 1,其余均为0 比如:10010001(二进制)&11110000等于10010000(二进制)。 3、 位逻辑或运算   | 位逻辑或运算将两个运算对象按位进行或运算。或运算的规则是:1或1等1,1或0等于1, 0或0等于0。只有 0|0=0,其余均为1 比如10010001(二进制)| 11110000(二进制)等于11110001(二进制)。 4 、位逻辑异或运算   ^ 位逻辑异或运算将两个运算对象按位进行异或运算。异或运算的规则是:1异或1等于0,1异或0等于1,0异或0等于0。即:相同得0,相异得1。 比如:10010001(二进制)^11110000(二进制)等于01100001(二进制)。 5 、位左移运算   <<

位运算的几种便捷操作,可以提高编写效率

你说的曾经没有我的故事 提交于 2020-02-11 14:38:20
*** java位运算的几种便捷操作,可以提高编写效率*** 1,思考:2变成8的最快方法 大家都知道2*2*2=8,但是今天我们要利用为运算的相关机制,给大家介绍一种更加快速的方法。 2的二进制数: 8的二进制数: 0010 1000 我们可以直接将2的二进制数直接左移2位即可得到8 System . out . println ( 2 << 2 ) ; 2,快速判断一个奇偶数 判断一个数是奇数还是偶数比较常见的方法是用这个数对2取余,如果是奇数则余1,如果是偶书则余0; 这里我们以数字8和数字9举例: 8的二进制数: 9的二进制数: 1000 1001 二进制机制中我们可以发现这样一个规律,除了最后一位代表1,其余位置(2,4,6,8……)都是2的倍数。 所以我们只需要将这个数字和1进行&(与)运算。偶数就会得到0,奇数就会得到1 System . out . println ( "9&1" + " = " + ( 9 & 1 ) ) ; System . out . println ( "8&1" + " = " + ( 8 & 1 ) ) ; System . out . println ( "0&1" + " = " + ( 0 & 1 ) ) ; 3,快速交换2个数字的值 有一杯可乐,一杯牛奶,现在需要将装可乐的杯子装牛奶,装牛奶的杯子装可乐。我们就需要第三个杯子。

C++中位运算的使用方法

匆匆过客 提交于 2020-02-10 16:02:36
一:简介 1 位逻辑运算符: & (位 “与”) and ^ (位 “异或”) | (位 “或”) or ~ (位 “取反”) 2 移位运算符: << (左移) >> (右移) 优先级 位“与”、位“或”和位“异或”运算符都是双目运算符,其结合性都是从左向右的,优先级高于逻辑运算符,低于比较运算符,且从高到低依次为&、^、| 二:位逻辑运算 & 运算 ———————– -2个都为1-》1 0&1 =0; 0&0 =0; 1&0 =0; 1&1 =1; 00111 & =00100 11100 &运算通常用于二进制取位操作,例如一个数 &1的结果就是取二进制的最末位。 这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数是偶数,最末位为1表示该数为奇数 —————————————————————– | 运算 ————————— 1个为1–》1 0|0=0; 0|1=1; 1|0=1; 1|1=1; 00111 | =11111 11100 | 运算通常用于二进制特定位上的无条件赋值,例如一个数|1的结果就是把二进制最末位强行变为1 如果需要把二进制最末位变成0,对这个数 |1之后再减一就可以了,其实际意义就是把这个数强行变成最近接的偶数 ——————————————————————– ^ 运算 ————————— 不同则为1,相同则为0 //

CodeForces 558C(位运算)

℡╲_俬逩灬. 提交于 2020-02-10 05:24:32
题目链接 : CodeForces 558C 题目大意 给你n个数,每个数 ai 可以做两种变换, ai = ai*2 ; ai = ai/2; 问最少经过多少次变换能使所有的数相同 例如 4 8 2 (8 -> 4 2 -> 4) 最少需要变换2次; 给个样例 5 4 4 (5 -> 2, 2->4) 也是最小需要两次; 思路 每个数乘2 或者除2 , 有没有想到什么? 没错就是位运算。 我们可以通过位运算枚举出每一个数 ai 可以转变成的数, 以及变成这个数所需要的转换次数。 用visit[ i ]储存可以转变到的数 i 的次数, 用 cnt[ i ]储存转变到 数 i 所需要的步数。 因此最后我们只要枚举所有visit[ i ] 等于 n 的数,并求出对应最小的 cnt[ i ],就行了。 ①向上枚举到 1e5 ②向下枚举 如果 ai 是奇数 , 则先保存 ai>>1 的数据, 然后再将 ai <<1 左移直到1e5 (想想为什么 , 参照上面的样例) 如果是偶数,直接保存 ai>>1 的数据。 ③枚举 1 ~ 2e5 所有的visit[ i ],比较对应的cnt[ i ],找到最小值。 源代码 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn =

洛谷P2114 [NOI2014]起床困难综合症【位运算】

微笑、不失礼 提交于 2020-02-08 23:12:50
传送门 按位运算是不用进位的,参与运算的各个位是独立的,因此我们可以拆开来算。 我们可以从高位到低位,依次考虑X的每一位填0还是1. x的第k位应该是1的时候,当且仅当同时满足下列两个条件: 1.已经填好的更高位构成的数值加上1<<k以后不超过m 2.用每个参数的第K位参与位运算。若初值为1,则n次位运算后的结果为1;若初值为0,则n次位运算的结果为0 # include <bits/stdc++.h> using namespace std ; const int N = 100000 ; int n , m ; pair < string , int > a [ N ] ; int bitcal ( int bit , int t ) { for ( int i = 0 ; i < n ; i ++ ) { int x = a [ i ] . second >> bit & 1 ; if ( a [ i ] . first == "AND" ) t & = x ; if ( a [ i ] . first == "OR" ) t | = x ; if ( a [ i ] . first == "XOR" ) t ^ = x ; } return t ; } int main ( ) { cin >> n >> m ; for ( int i = 0 ; i < n ; i ++

位运算与MOD快速幂详细知识点

孤街醉人 提交于 2020-02-07 08:15:14
最近写的一些题目设计到了数论的取模 如下题 链接: https://ac.nowcoder.com/acm/contest/3003/G 来源:牛客网                     时间限制:C/C++ 1秒,其他语言2秒                     空间限制:C/C++ 262144K,其他语言524288K                         64bit IO Format: %lld 题目描述   牛可乐有七个整数 a,b,c,d,e,f,g.并且他猜想a d +b e +c f =g 但是牛可乐无法进行如此庞大的计算。请验证牛可乐的猜想是否成立。 输入描述:   第一行一个正整数 T,表示有 T 组数据。   每组数据输入一行七个整数a,b,c,d,e,f,g 。   保证 1≤T≤1000 , −10 9 ≤a,b,c,g≤10 9 , 0≤d,e,f≤10 9 保证不会出现指数和底数同为 0 的情况。 输出描述: 每组数据输出一行,若猜想成立,输出 Yes ,否则输出 No。 示例:   输入:      2     1 1 4 5 1 4 258     114514 1919810 1 2 3 4 1   输出:      Yes     No   说明:      1 5 +1 1 +4 4 =258     114514 2

关于位运算的水题

不想你离开。 提交于 2020-02-07 05:55:54
找数字 2 Time Limit: 25000ms, Special Time Limit:50000ms, Memory Limit:32768KB Total submit users: 92, Accepted users: 67 Problem 11466 : No special judgement Problem description 给定 2n+1 个数字,只有一个数字出现了奇数次,其余的数字都出现了偶数次,现在你需要找出出现奇数次的数字。 Input 包含多组数据,每组数据第一行为一个数 n(0<=n<=5000000) 。接下来一行包括 2N+1 个数字。 Output 对于每组数据,输出出现奇数次的数字 . Sample Input 1 1 1 1 2 1 2 1 3 3 3 1 1 2 2 3 3 4 Sample Output 1 2 4 这是湖师大的14年校赛的一道水题 题目的意思很清楚就是说要你在输入的数字中找出出现奇数次次数的数字 我刚上手就是两个for的嵌套,但是给出的数据很大,所以TLE了 后来哈德斯告诉我其实这个题目可以用位运算来做,然后我就看了看位运算 就有: 1^1=0 0^0=0 1^0=1 1^0=1 布尔型的就有: True ⊕ False = True False ⊕ True = True False ⊕ False =

计算机底层位运算学习笔记

心已入冬 提交于 2020-02-07 00:14:36
分享一个讲解位运算的视频链接: https://www.bilibili.com/video/av38555778?p=5 以下是文字讲解: 标黄的数字为参与运算的二进制数。 &:代表与;& 运算的两组数中只有两者都是1的情况才,结果才是1,其余情况都是0。 |:代表或; | 运算的两组数中只要其中一组数中有1,则结果是1,其余情况都是0。 ~:代表取反; 即0变成1, 1变成0,属于位运算中最容易记住的操作。 ^:代表异或;即相等为0,不等为1。 <<:代表左移n位,计算得到的结果变大了。 >>: 代表右移n位,计算得到的结果变小了。 来源: CSDN 作者: doinbb 链接: https://blog.csdn.net/doinbb/article/details/104202763

位运算实现权限管理

不羁岁月 提交于 2020-02-06 19:57:20
public class Permission { // 是否允许查询,二进制第1位,0表示否,1表示是 public static final int ALLOW_SELECT = 1 << 0; // 0001 // 是否允许新增,二进制第2位,0表示否,1表示是 public static final int ALLOW_INSERT = 1 << 1; // 0010 // 是否允许修改,二进制第3位,0表示否,1表示是 public static final int ALLOW_UPDATE = 1 << 2; // 0100 // 是否允许删除,二进制第4位,0表示否,1表示是 public static final int ALLOW_DELETE = 1 << 3; // 1000 // 存储目前的权限状态 private int flag; // 设置用户的权限 public void setPer(int per){ flag = per; } // 增加用户的权限(1个或者多个) public void enable(int per){ flag = flag|per; } // 删除用户的权限(1个或者多个) public void disable(int per){ flag = flag&~per; } // 判断用户的权限 public boolean