异或

Java中的位运算

烂漫一生 提交于 2019-12-20 00:29:42
  最近饶有兴致,看了一些java源代码,发现源码里面一些精巧的实现是通过位运算实现的,比如十进制整数转成十六进制形式字符串输出: 1 public static String toHexString(int i) 2 { 3 return toUnsignedString(i, 4); 4 } 5 6 private static String toUnsignedString(int i, int shift) { 7 char[] buf = new char[32]; 8 int charPos = 32; 9 int radix = 1 << shift; 10 int mask = radix - 1; 11 do { 12 buf[--charPos] = digits[i & mask]; 13 i >>>= shift; 14 } while (i != 0); 15 16 return new String(buf, charPos, (32 - charPos)); 17 } 18 19 final static char[] digits = { 20 '0' , '1' , '2' , '3' , '4' , '5' , 21 '6' , '7' , '8' , '9' , 'a' , 'b' , 22 'c' , 'd' , 'e' , 'f' , 'g

P4551 最长异或路径 题解

点点圈 提交于 2019-12-18 14:50:19
P4551 最长异或路径 Trie-字典树-图论 给出一个无根树,每条边有边权,求一条路径,使得这条路径上的边权异或和最大 下面一些关于异或最短路和证明: 与普通最短路不一样的是,这里最短路的距离求的是异或和,而这里的关键就是异或的重要性质:逆反性 首先,随便选一个点 s s s 当起点,跑一边最短路,求出dis数组, d i s [ x ] dis[x] d i s [ x ] 表示点 x x x 到起点的最短路长度。 当询问点 x x x 到点 y y y 的最短路时,分两种情况: 点 x x x 到点 y y y 的最短路径经过点 s s s ,那 x x x 到 y y y 的最短路就是 dis[x]^dis[y] 点 x x x 到点 y y y 的最短路径不经过点 s s s ,如下图: x x x 到 y y y 的最短路为 c c c , d i s [ x ] = a dis[x]=a d i s [ x ] = a 的话,可证明出 dis[y]=a ^ c ,而这样的话 dis[x] ^ dis[y] = a ^ c ^ a = c 所以,点 x x x 到点 y y y 的最短路还是 dis[x]^dis[y] 上面证明我的博客 题解 P5651 【基础最短路练习题】 ,那题也是求异或和最短路 找出异或的性质后,第一个想到的肯定是 O ( n 2 ) O(n

leetcode -- Single Number

我怕爱的太早我们不能终老 提交于 2019-12-18 13:37:03
Given an array of integers, every element appears twice except for one. Find that single one. Could you implement it without using extra memory? [解题思路] 以前看书时遇到过,一个数组中有一个元素出现一次,其他每个元素都出现两次 要求空间复杂度为O(1) 由于两个相同的元素异或的结果为0,而0^a==a,将数组中所有元素都进行异或,得到结果就是只出现一次的元素 1 public class Solution { 2 public int singleNumber(int[] A) { 3 // Note: The Solution object is instantiated only once and is reused by each test case. 4 if(A == null || A.length == 0){ 5 return 0; 6 } 7 int result = A[0]; 8 9 for(int i = 1; i < A.length; i++){ 10 result = result ^ A[i]; 11 } 12 return result; 13 } 14 } 本题扩展 1.一个数组中有两个元素只出现一次

Educational Codeforces Round 58 (Rated for Div. 2) 题解

可紊 提交于 2019-12-18 01:08:47
Educational Codeforces Round 58 (Rated for Div. 2) 题目总链接: https://codeforces.com/contest/1101 A. Minimum Integer 题意: 多组数据,给你三个数l,r,d,要求在区间[l,r]之外找一个最小的x,使得x%d==0。 题解: 当d<l or d>r的时候,直接输出d就好了。 当l<=d<=r的时候,找到最小的t,使得t*d>r就行了。 具体操作见代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; int q; ll l,r,d; int main(){ cin>>q; while(q--){ cin>>l>>r>>d; if(d<l || d>r) cout<<d<<endl; else{ ll now = r/d; cout<<(now+1)*d<<endl; } } return 0; } View Code B. Accordion 题意: 给出一个字符串,要求删去一些数后它由以下几个部分组成,[ : .... : ],这其中"...."指的是0个或多个“ | ”。 问满足上面条件时,留下的字符串的最大长度为多少。 题解: 模拟一下就好了,从左往右遍历找 [ 以及 :

JAVA的小程序实现文件加密

五迷三道 提交于 2019-12-17 04:36:54
public class Test { //原理是利用异或符号,使用两次还是返回原来的值 利用输入输出流对文件读写操作 public static void main(String[] args) throws IOException { FileInputStream in = new FileInputStream("F:/文件"); FileOutputStream out = new FileOutputStream("F:/文件"); byte[] arr = new byte[1024*8]; int len; while((len = in.read(arr))!=-1){ //将原来的数据统一每一个字节都去异或 for (int i = 0; i < arr.length; i++) { arr[i]^=5; } out.write(arr,0,len); } in.close(); out.close(); } } 来源: CSDN 作者: 郭一零 链接: https://blog.csdn.net/zpguoyun1024/article/details/103571051

c#16进制10进制转换

这一生的挚爱 提交于 2019-12-16 14:56:45
//十进制转二进制 Console.WriteLine(Convert.ToString(69, 2)); //十进制转八进制 Console.WriteLine(Convert.ToString(69, 8)); //十进制转十六进制 Console.WriteLine(Convert.ToString(69, 16)); //二进制转十进制 Console.WriteLine(Convert.ToInt32(”100111101″, 2)); //八进制转十进制 Console.WriteLine(Convert.ToInt32(”76″, 8)); //C# 16进制转换10进制 Console.WriteLine(Convert.ToInt32(”FF”, 16)); 在C#中可以对整型运算对象按位进行逻辑运算。按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个位的逻辑运算结果是结果值的每个位。 C#支持的位逻辑运算符如表2所示。 运算符号 意义 运算对象类型 运算结果类型 对象数 实例 ~ 位逻辑非运算 整型,字符型 整型 1 ~a & 位逻辑与运算 2 a & b | 位逻辑或运算 2 a | b ^ 位逻辑异或运算 2 a ^ b << 位左移运算 2 a<<4 >> 位右移运算 2 a>>2 1、位逻辑非运算 位逻辑非运算是单目的

异或的路径(路径异或前缀 + 按位贡献)

拈花ヽ惹草 提交于 2019-12-15 06:41:04
链接 题 目 描 述 题目描述 题 目 描 述 给一棵 n 个点的树,1 号节点为根,边有边权,令 f(u,v) 表示 u 节点到 v 节点,路径上边权异或值。求 ∑ i = 1 n ∑ i = 1 n f ( i , j ) \sum_{i=1}^n\sum_{i=1}^nf(i,j) ∑ i = 1 n ​ ∑ i = 1 n ​ f ( i , j ) , 结果对 1000000007 取模。 输入描述: 第一行一个整数 n ( n ≤ 100000 ) n(n≤100000) n ( n ≤ 1 0 0 0 0 0 ) ,接下来 n-1 行,第 i 行输入两个整数, ( p [ i ] < i ) , v [ i ] ( 100000 > = v [ i ] > = 1 ) ( 分 别 表 示 i + 1 号 节 点 的 父 亲 , 以 及 i + 1 与 p [ i ] 相 连 的 边 的 权 值 。 (p[i] < i), v[i](100000>=v[i]>=1) (分别表示 i+1号节点的父亲,以及 i+1 与 p[i] 相连的边的权值。 ( p [ i ] < i ) , v [ i ] ( 1 0 0 0 0 0 > = v [ i ] > = 1 ) ( 分 别 表 示 i + 1 号 节 点 的 父 亲 , 以 及 i + 1 与 p [ i ] 相 连 的

136.只出现一次的数字

Deadly 提交于 2019-12-14 17:39:11
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 思路:使用异或的方法 class Solution { public int singleNumber ( int [ ] nums ) { //异或的方法太强了!!!! if ( nums . length < 1 ) return - 1 ; int res = nums [ 0 ] ; for ( int i = 1 ; i < nums . length ; i ++ ) { res ^= nums [ i ] ; } return res ; } } 来源: CSDN 作者: fsdgfsf 链接: https://blog.csdn.net/fsdgfsf/article/details/103538850

简单的Nim游戏

拜拜、爱过 提交于 2019-12-13 15:44:04
题目 题目描述 给定长度为 n n n 的非负整数序列 { a } \{a\} { a } 。构造长度为 n n n 的序列 { b } \{b\} { b } ,满足 { b } \{b\} { b } 的异或和为 0 0 0 。最小化 ∑ i = 1 n ∣ a i − b i ∣ \sum_{i=1}^{n}|a_i-b_i| ∑ i = 1 n ​ ∣ a i ​ − b i ​ ∣ 数据范围与约定 n ≤ 15 , a i < 2 30 n\le 15,a_i< 2^{30} n ≤ 1 5 , a i ​ < 2 3 0 思路 耿直的暴力 用 f ( i , s ) f(i,s) f ( i , s ) 表示前 i i i 个数的异或和为 s s s ,代价最小是多少。枚举第 i + 1 i+1 i + 1 个数即可。 时间复杂度 O ( n V 2 ) \mathcal O(nV^2) O ( n V 2 ) ( V V V 是 a a a 的值域) 状压的 DP \text{DP} DP 用 f ( k , S , i , 0 / 1 ) f(k,S,i,0/1) f ( k , S , i , 0 / 1 ) 表示考虑到第 k k k 高的位。 S S S 是一个 3 3 3 进制状态压缩。 在 S S S 中为 0 0 0 :没有发生过变动。 为 1 1 1

CRC检验码计算——C语言(CRC8/16/32)

自闭症网瘾萝莉.ら 提交于 2019-12-12 13:52:47
1、基本概念 1.1、循环冗余检测(Cyclic Redundancy Check,CRC) CRC编码也被称为多项式编码(polynomial code),因为该编码能够将要发送的比特串看作是系数为 0 和 1 的一个多项式。对比特串操作被解释为多项式算术。 1.2、CRC参数 D:D数据拥有 d 比特 G:发送方和接收方需要协商一个 r+1 比特模式,称为生成多项式(G), G 的最高有效位比特(最高位)和 最低有效位比特(最低位)必须为 1 R:发送方选择 r 个附加比特,称为 R(CRC校验码) (1) 计算 :R 是数据 D 通过 模 2 除法 除 G 运算得到的(姑且这么说)余数, 这个 R 就是 FCS(检测帧序列) ,发送时把 R 附加到数据 D 后面。 (2) 检验 :一共接收有 d+r 个比特,用模 2 算术恰好能够被 G 整除(没有余数),即 (D+R)/ G,如果余数为 0,接收方认为数据正确而被接收,否则接收方知道出现了差错。 1.3、CRC原理解释 所有 CRC 计算采用模 2 算术,即在加法中不进位,在减法中不借位,意味加法和减法是相同的, 等价于操作数的按位异或(XOR)运算 ,而不是需要借位运算。 例如: D = 10110011,d = 8 G = 11001,r = 4 通过计算得到 R = 0100 在这种情况下传输 12 个比特是