位运算之 |
您所在的位置:网站首页 › delphi按位与操作 › 位运算之 |
学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 & 和 %操作之间的关系!故整理学习资料如下: 原文引自:http://blog.sina.com.cn/s/blog_7b7cad23010163vy.html
由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。
按位与(Bitwise AND),运算符号为& a&b 的操作的结果:a、b中对应位同时为1,则对应结果位也为1、 例如: 10010001101000101011001111000 & 111111100000000 --------------------------------------------- 101011000000000
对10101100000000进行右移8位得到的是101011,这就得到了a的8~15位的掩码了。 那么根据这个启示,判断一个整数是否是处于 0-65535(2^16) 之间(常用的越界判断): 用一般的 (a >= 0) && (a 2) + (n & 0x33333333); //0xF0F0F0F0,0x0F0F0F0F分别是以“4位”为单位提取奇偶位 n = ((n & 0xF0F0F0F0) >> 4) + (n & 0x0F0F0F0F);//0xFF00FF00,0x00FF00FF分别是以“8位”为单位提取奇偶位 n = ((n & 0xFF00FF00) >> 8) + (n & 0x00FF00FF);//0xFFFF0000,0x0000FFFF分别是以“16位”为单位提取奇偶位 n = ((n & 0xFFFF0000) >> 16) + (n & 0x0000FFFF);return n; } 举个例子吧,比如说我的生日是农历2月11,就用211吧,转成二进制:n = 11010011 计算n = ((n & 0xAAAAAAAA) >> 1) + (n & 0x55555555); 得到 n = 10010010 计算n = ((n & 0xCCCCCCCC) >> 2) + (n & 0x33333333); 得到 n = 00110010 计算n = ((n & 0xF0F0F0F0) >> 4) + (n & 0x0F0F0F0F); 得到 n = 00000101 -----------------à无法再分了,那么5就是答案了。 4、对于正整数的模运算(注意,负数不能这么算)
先说下比较简单的: 乘除法是很消耗时间的,只要对数左移一位就是乘以2,右移一位就是除以2,传说用位运算效率提高了60%。 乘2^k众所周知: n |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |