位运算

C#位运算

ぃ、小莉子 提交于 2020-01-31 05:24:56
C#位运算 在C#中可以对整型运算对象按位进行逻辑运算。按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个位的逻辑运算结果是结果值的每个位。C#支持的位逻辑运算符如表2.9所示。 运算符号 意义 运算对象类型 运算结果类型 对象数 实例 ~ 位逻辑 非 运算 整型,字符型 整型 1 ~a & 位逻辑 与 运算 2 a & b | 位逻辑 或 运算 2 a | b ^ 位逻辑 异或 运算 2 a ^ b << 位 左移 运算 2 a<<4 >> 位 右移 运算 2 a>>2 1、 位逻辑非运算 位逻辑非运算是单目的,只有一个运算对象。位逻辑非运算按位对运算对象的值进行非运算,即:如果某一位等于0,就将其转变为1;如果某一位等于1,就将其转变为0。 比如,对二进制的10010001进行位逻辑非运算,结果等于01101110,用十进制表示就是: ~145等于110;对二进制的01010101进行位逻辑非运算,结果等于10101010。用十进制表示就是~85等于176。 2 、位逻辑与运算 位逻辑与运算将两个运算对象按位进行与运算。与运算的规则:1与1等于1,1与0等于0。 比如:10010001(二进制)&11110000等于10010000(二进制)。 3、 位逻辑或运算 位逻辑或运算将两个运算对象按位进行或运算。或运算的规则是:1或1等1,1或0等于1,

C#位运算

房东的猫 提交于 2020-01-31 04:46:07
在C#中可以对整型运算对象按位进行逻辑运算。按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个位的逻辑运算结果是结果值的每个位。C#支持的位逻辑运算符如表2.9所示。 运算符号 意义 运算对象类型 运算结果类型 对象数 实例 ~ 位逻辑 非 运算 整型,字符型 整型 1 ~a & 位逻辑 与 运算 2 a & b | 位逻辑 或 运算 2 a | b ^ 位逻辑 异或 运算 2 a ^ b << 位 左移 运算 2 a<<4 >> 位 右移 运算 2 a>>2 1、 位逻辑非运算 位逻辑非运算是单目的,只有一个运算对象。位逻辑非运算按位对运算对象的值进行非运算,即:如果某一位等于0,就将其转变为1;如果某一位等于1,就将其转变为0。 比如,对二进制的10010001进行位逻辑非运算,结果等于01101110,用十进制表示就是: ~145等于110;对二进制的01010101进行位逻辑非运算,结果等于10101010。用十进制表示就是~85等于176。 2 、位逻辑与运算 位逻辑与运算将两个运算对象按位进行与运算。与运算的规则:1与1等于1,1与0等于0。 比如:10010001(二进制)&11110000等于10010000(二进制)。 3、 位逻辑或运算 位逻辑或运算将两个运算对象按位进行或运算。或运算的规则是:1或1等1,1或0等于1, 0或0等于0

位运算

有些话、适合烂在心里 提交于 2020-01-30 19:11:33
前面的话 巧妙使用位运算,在算法方面往往比四则运算要快许多。 左移(<<) 运算规则: 将一个数的二进制全部左移若干位,右补若干个0。 若要被舍弃的高位为0,则舍弃; 若要被舍弃的高位为1,则不舍弃。 若a=15,将其左移2位。即a的二进制数0000 1111,将其左移2位,右补2个0,则变为00111100,即十进制的60。 若a=64,将其左移2位。即a的二进制数为0100 0000,左移一位,1000 0000,左移两位 0000 0001 0000 0000 ,即十进制的256 结论:左移一位相当于该数乘以2,左移两位相当于乘以2^2。 带符号右移(>>) 运算规则: 将数的二进制形式把所有的数字向右移动对应的位数,低位移出舍弃。 若是正数,高位的空位补0 若是负数,高位的空位补1 若a=11,将其右移2位。即0000 1011,将其低位的最后两个数移出,因为该数字是正数,将其右移,高位补2个0,最终为0000 0010,即十进制的2。 结论:正数的右移一位相当于除2,右移n为相当于除以2的n次方。这是取商,余数不要。 右移可以在二分算法中取中间值: 例如: 13>>1 // 6 无符号右移(>>>) 运算规则: 按二进制形式把所有的数字向右移动对应的位数,低位移出舍弃,高位的空位补0。 没有正负数之分,高位都是补0 按位操作 按位与 每一位都为1,结果才是1 8 & 7

使用位运算代替取模(%)

*爱你&永不变心* 提交于 2020-01-30 13:28:42
先抛结论:取模运算(a%b)在当b为 2^n 时可简化为a&(b-1) 证明一: 1.当b为 2^n 时,b-1的二进制为011..11(0后面跟n个1).此时a&(b-1)即取a二进制右面n位 2.当b为 2^n 时,a/b的意义就是a右移n位。而右移的n位的值,就是a%b的值 两个值相等 证明二: 直接给a、n取一个值,直观的看到 看不懂请留言,初步只是给自己整理知识用的。后续有时间整理修订 来源: CSDN 作者: 克克克 链接: https://blog.csdn.net/kjlist2017/article/details/104113265

逻辑运算,短路运算,位运算,幂运算

五迷三道 提交于 2020-01-29 10:13:20
//幂运算. 很多运算会使用工具类来运算 double pow = Math . pow ( 2 , 3 ) ; System . out . println ( pow ) ; //逻辑运算符 // 与 或 非 boolean a = true ; boolean b = false ; System . out . println ( "a && b: " + ( a && b ) ) ; //逻辑与运算:两个变量都为真,结果才为true System . out . println ( "a || b: " + ( a || b ) ) ; //逻辑与运算:两个变量有一个为真,则结果才为true System . out . println ( "!(a && b): " + ! ( a && b ) ) ; //如果是真,则变为假,如果是假,则变为真 //短路运算 假如 a&&b 的运算中,a是false,那边不会计算后一个变量,这叫短路运算 int g = 5 ; boolean h = ( g < 4 ) && ( g ++ < 4 ) ; System . out . println ( h ) ; System . out . println ( g ) ; // << = *2; >> = /2; 来源: CSDN 作者: Progutenberg 链接:

位运算(按位与、按位或、异或)

…衆ロ難τιáo~ 提交于 2020-01-28 20:21:25
按位与运算符(&) 参加运算的两个数,按二进制位进行“与”运算。 运算规则:只有两个数的二进制同时为1,结果才为1,否则为0。(负数按补码形式参加按位与运算) 即 0 & 0= 0 ,0 & 1= 0,1 & 0= 0, 1 & 1= 1。 例:3 &5 即 00000011 & 00000101 = 00000001 ,所以 3 & 5的值为1。 (都为1才为1,00/01/10都是0) 00000011 00000101 -------- 00000001 按位或运算符(|) 参加运算的两个数,按二进制位进行“或”运算。 运算规则:参加运算的两个数只要两个数中的一个为1,结果就为1。 即 0 | 0= 0 , 1 | 0= 1 , 0 | 1= 1 , 1 | 1= 1 。 例:2 | 4 即 00000010 | 00000100 = 00000110 ,所以2 | 4的值为 6 。 (有一个为1则为1,11/10/01为1,00则为0) 00000010 00000100 -------- 00000101 异或运算符(^) 参加运算的两个数,按二进制位进行“异或”运算。 运算规则:参加运算的两个数,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。 即 0 ^ 0=0 , 0 ^ 1= 1 , 1 ^ 0= 1 , 1 ^ 1= 0 。 例: 2 ^ 4 即

位运算:二进制中1的个数

醉酒当歌 提交于 2020-01-27 06:37:39
常用操作: 1.求n的第k位数字: n >> k & 1 2.返回n的最后一位1: lowbit(n) = n & ( - n ) lowbit(x)是树状数组里面的常规操作 在二进制中x是原码,-x是反码,-x+1是补码: 题目链接:https://www.acwing.com/problem/content/803/ 给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。 数据范围 1≤n≤100000, 0≤数列中元素的值≤109 输入样例: 5 1 2 3 4 5 输出样例: 1 1 2 1 2 思路 :既然lowbit(x)可以直接返回x二进制最后一个1的位置代表的数,那么我们就可以利用这个性质来得到x的二进制里1的个数了。 代码实现: # include <bits/stdc++.h> using namespace std ; # define lowbit(x) x & (- x) int main ( ) { ios :: sync_with_stdio ( 0 ) ; cin . tie ( 0 ) ; cout . tie ( 0 ) ; int n ; cin >> n ; while ( n -- ) { int x ; cin >> x ; int ans = 0 ; while ( x ) x - = lowbit ( x ) , ans

位运算的简单应用-权限管理

独自空忆成欢 提交于 2020-01-27 02:19:18
个人博客 http://www.milovetingting.cn 位运算的简单应用-权限管理 位运算在实际的开发中,有很多巧妙的应用场景。如: 一个存放正整数的数组,里面有一个数字只出现一次,其它数字都出现两次,求只出现一次的数字。 不用临时变量,交换两个数字的值。 Android中Window设置Flag public void setFlags ( int flags , int mask ) { final WindowManager . LayoutParams attrs = getAttributes ( ) ; attrs . flags = ( attrs . flags & ~ mask ) | ( flags & mask ) ; mForcedWindowFlags |= mask ; dispatchWindowAttributesChanged ( attrs ) ; } 产品具有某些Feature,这些Feature可以利用位运算来存储。 下面利用位运算来简单模拟权限管理 权限管理类 public class PermissionManager { public static final int PERMISSION_NONE = 1 ; public static final int PERMISSION_A = 1 << 1 ; public

1.位运算 题六--用二进制表示十进制小数

余生长醉 提交于 2020-01-26 20:02:50
题目:将十进制小数用二进制表示,如果不能用32位小数表示,则输出“ERROR” 思路:1.将小数乘以2,若结果大于1,则将二进制小数位上表示1,并将结果减1 2.若结果小于1,则继续乘以2,循环1,2两步,直至结果等于0 3.若小数的位数超过34位,则输出“ERROR”,结束循环。 public class erjinzhixiaoshu { public static void main(String args[]) { double num=0.625; StringBuilder sb=new StringBuilder ("0."); while(num>0) { num=num*2;//乘以2,挪整 if(num>=1) { sb.append("1");//乘以2后大于1,则在后面添1, num=num-1;//消掉整数部分 } else{ sb.append("0");//添加0 num=num; } if(sb.length()>34)//若无法用法32位小数表示(加上0.两位,共34位) { System.out.print("ERROR");return ; } } System.out.print(sb.toString()); } } 2.数组实现(思路和上面一样,主要是复习了一下数组) public class erjinzhixiaoshu {

位运算

感情迁移 提交于 2020-01-26 19:11:15
二进制状态压缩 二进制状态压缩,是指将一个长度为m的bool数组用一个长度为 m 位二进制整数表示并储存的方法。 操作 运算 取出整数n在二进制表示下的第k位 (n >> k) & 1 取出整数n在二进制表示下的后k位 (n&(1 << k) - 1) 把整数n在二进制表示下的第k位取反 n xor (1 << k) 对整数n在二进制表示下的第k位赋值1 n|(1<<k) 对整数n在二进制表示下的第k位赋值0 n & (~(1<<k)) 这种运算方法简便,当 m 不大时,可以直接使用一个整数类型储存。当m较大时,可以使用数组储存,也可以利用C++STL提供的bitset 例题:最短Hamilton路径 题目链接 给定一张 n 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径。 Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次。 输入格式 第一行输入整数n。 接下来n行每行n个整数,其中第i行第j个整数表示点i到j的距离(记为a[i,j])。 对于任意的x,y,z,数据保证 a[x,x]=0,a[x,y]=a[y,x] 并且 a[x,y]+a[y,z]>=a[x,z]。 输出格式 输出一个整数,表示最短Hamilton路径的长度。 数据范围 1≤n≤20 0≤a[i,j]≤107 在任意时刻,又公式 F[i