移位运算用法总结 | 您所在的位置:网站首页 › js位移运算符 › 移位运算用法总结 |
位运算总结
原文 一、位运算应用口诀清零取位要用与,某位置一可用或 若要取反和交换,轻轻松松用异或 二、移位运算 它们都是双目运算符,两个运算分量都是整形,结果也是整形。‘’右移:左边空出的位,如果是正数则补0,若为负数则补0或1,取决于所用的计算机系统OS X中补1。其值相当于除以2。 三、位运算符的应用(原操作数s掩码mask) 按位与& 清零特定位(mask中特定位置0,其他位为1,s = s&mask)取某数中指定位(mask中特定位置1,其他位为0,s = s&mask)按位或| 常用来将原操作数某些位置1,其他位不变。(mask中特定位置1,其他位为0 s = s|mask)位异或^ 使特定位的值取反(mask中特定位置1,其他位为0,s = s^mask)不引入第三变量,交换两个变量的值(设a = a1,b = b1,a^b^a = b) 四、应用举例 判断整数a是奇数还是偶数 a&1 = 0 偶数a&1 = 1 奇数取整数a的第k位(k = 0,1,2,…len(str(a))),即a>>k&1将int型变量a的第k位清0,即a=a&~(1>1); } 判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂 boolean power2(int x) { return ((x&(x-1))==0)&&(x!=0); }9、不用temp交换两个整数 void swap(int x , int y) { x ^= y; y ^= x; x ^= y; }10、计算绝对值 int abs( int x ) { int y ; y = x >> 31 ; return (x^y)-y ; //or: (x+y)^y } 11、取模运算转化成位运算 (在不产生溢出的情况下) a % (2^n) 等价于 a & (2^n - 1) 12、乘法运算转化成位运算 (在不产生溢出的情况下) a * (2^n) 等价于 a> n 例: 12/8 == 12>>3 14、a % 2 等价于 a & 1 15、if (x == a) x= b;else x= a; 等价于 x= a ^ b ^ x; 16、x 的相反数表示为 (~x+1) 比较浅显的来说,左移n位就是乘以2的n次方,右移n位就是除以2的n次方。具体细节如下: C语言里的左移和右移运算 2006-09-30 13:52 先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用> 1; //i的值不会变成0x40000000,而会变成0xc0000000 就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位. 负数10100110 >>5(假设字长为8位),则得到的是 11111101 //前面三个101往右移5位;总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多. unsigned char a; a=1; //0b00000001 a |
CopyRight 2018-2019 实验室设备网 版权所有 |