03 2017 档案
摘要:实例十八:去n的第一个出现的1 方法:result=n & (n-1) 与实例十七 思路类似。实例十七是不断取1,本例只去最低位。 解释:n 0000 1111n-1 0000 1110& 0000 1110 可见把最低位1去掉了 当然,也可以不断循环,把全部1换为0. 代码: int _tmain
阅读全文
摘要:实例十七:n的二进制中有几个1 方法:result=n & (n-1) n&(n-1)的目的使最低位的1不断翻转。 比如:n=108,其二进制表示为0110 1100,则n&(n-1)的结果为0110 1000.因此只要不停地翻转n的二进制的最低位的1,每一次翻转让计数器+1,直到n等于0时,计数器
阅读全文
摘要:实例十五:十进制转成二进制 方法一:result = (n >> (31 - i)) & 1 原数依次从高位到低位,和数值'1'进行与操作,并不断输出结果。 方法二:result=a & (1 << i) 依次把数值‘1’从低位到高位,和原数进行与操作,并不断输出结果。 解释: 十进制数值在计算机中
阅读全文
摘要:实例十四:数值交换 显然,实现数值交换的方法有很多,在此列举三种进行对比: 方法一:利用第三变量进行交换 定义:a,b,temp { temp=a b=a b=temp } 方法二:不利用第三变量 a,b { a=a+b b=a-b a=a-b } 方法三:利用位操作符,逻辑与方法二类似 a,b {
阅读全文
摘要:实例十三:左循环移位 方法:result=n<<k|n>>(32-k) (1) b:将n的左端的k位先放到b中的低位中。 b=n>>(32-k); (2) c:将n左移k位,起右边低位k位补0。 c=n<<k; (3)将b和c进行或操作. 解释:原数 1011 1100右移k位 0000 0010
阅读全文
摘要:实例十二:右循环移位 方法:result=n>>k|n<<(32-k) (1) b:将n的右端的k位先放到b中的高位中。 b=n<<(32-k); (2) c:将n右移k位,其左边高位k位补0。 c=n>>k; (3) 将b和c进行或操作. 简化例子: x=n<<4 x保存n左移4位后的数 y=n>
阅读全文
摘要:实例十一:取n的某些位 方法:result=(n>>4)&(~(~0<<4)) 取出某数n的低4位。 数值0 0000 0000 ~0 1111 1111 ~0<<4 1111 0000 ~(~0<<4) 0000 1111 int _tmain(int argc, _TCHAR* argv[]){
阅读全文
摘要:位运算:是直接对整数在内存中的二进制位进行操作,效率高。 位运算的分类: ~ 按位取反 ^ 异或 | 按位或 & 按位与 && 逻辑与 || 逻辑或 ! 逻辑非 << 左移 >> 右移 >>> 右移 0填充 为了方便,以下二进制位以8位。 位与&:是参与运算的两数各对应的二进位相与, 有0为0,全1
阅读全文
摘要:实例十:n的相反数 方法:result=(~n)+1 正数 负数 原数 0000 0011 1111 1111补码 1111 1100 0000 0010加一 1111 1011 0000 0011 1、正数 对于正数的相反数来说,补码就是除符号位变为1,其他不变,计算机中 对于一个数字来说存储的都
阅读全文
摘要:实例九:除法运算转成位运算 方法:n>>k 等价于 n/(2^k) 右移一位相当于除以2。 比如 9/4=2 n=9,4=2^2 所以k=2,即右移2位。用9>>2可以实现。 解释: 原数 0000 1000 8右移一位 0000 0100 4 相当于除以2再右移一位 0000 0010 2 代码:
阅读全文
摘要:实例八:乘法运算转成位运算 方法:n<<k 等价于 n*(2^k) 左移一位相当于乘以2。 比如 9*4=36 n=9,4=2^2 所以k=2,即左移2位。用9<<2可以实现; 解释: 原数 0000 0010 2左移一位 0000 0100 4 相当于乘2再左移一位 0000 1000 8 代码:
阅读全文
摘要:实例七:模运算转成位运算 方法:n &(((1<<k)-1) 等价于 n %(2^k) 一个数除以一个2的k倍,即左移k位。 比如:15%4 n=15,k=2. k左移1位扩为4.再减一和n进行与操作。 解释:2的几次幂就左移几位。 8 15原数 0000 1100 0000 11114 0000
阅读全文
摘要:实例六:绝对值 32位系统方法:y=x>>31 result=x^y-y; x是要求绝对值的值,y为临时变量,result为x的绝对值。 一个负数右移31位后位-1;正数则为0; 为了方便 ,以8位位解释。 负数解释:原数 1100 0011 -3 方法中的x 移位31位 1100 0001 -1
阅读全文
摘要:实例五:n是否是2的幂 方法一:result=n&(n-1) 如果result=0 则n是2的幂方法二:result=n&((~n)+1) 如果result=n 则n是2的幂 原数 0000 1000 8 0000 1000 8原数+1 & 0000 1001 9 & 0000 0111 7 原数-
阅读全文
摘要:实例四:将n的k位s置1 方法:result =n|(1<<k) 只使k位变为1,其他位为0,再进行或操作,1与任何数的或操作都是1. 解释: 原数 0000 1011 11 数值1 0000 0001 11左移 0000 0100 4和原数或操作 0000 1111 //与原数比0变为1 值为15
阅读全文
摘要:实例三:将n的k位清0 方法: result= n &~(1<<k) 使第k为变成0,再与运算,0和任何数进行与运算都是0。 解释: 0000 0001 1 左移k位 0000 1000 取反操作 1111 0111 原数 1111 1111 取反后与原数进行与操作 结果 1111 0111 k清零
阅读全文
摘要:实例二:取n的第k位 方法:a>> k & 1 某值a右移K位后与整数“1”进行与运算。即把需要第几位就右移几位。 例子: 0000 1000 8右移3位 0000 0001 1与1进行与操作 0000 0001 1 结果: 0000 0001 1 代码:int _tmain(int argc, _
阅读全文
摘要:实例一:奇偶判断:判断某一个数,是奇数还是偶数。 方法:用该数字与整数“1”进行按位与运算。 解释:为方便,以8位为介绍。如: 0000 0011 3&0000 0001 1 0000 0001 1为奇数 0000 0010 2&0000 0001 1 0000 0000 0位偶数 代码:int _
阅读全文