位运算应用口诀
清零取位要用与,某位置一可用或
若要取反和交换,轻轻松松用异或
移位运算
要点
1 它们都是双目运算符,两个运算分量都是整形,结果也是整形。
2 "<<" 左移:右边空出的位上补0,左边的位将从字头挤掉,其值相当于乘2。
3 ">>"右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统。
4 ">>>"运算符,右边的位被挤掉,对于左边移出的空位一概补上0。
位运算符的应用 (源操作数s 掩码mask)
(1) 按位与– &
1 清零特定位 (mask中特定位置0,其它位为1,s=s&mask)
2 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask)
(2) 按位或– |
常用来将源操作数某些位置1,其它位不变。 (mask中特定位置1,其它位为0 s=s|mask)
(3) 位异或– ^
1 使特定位的值取反 (mask中特定位置1,其它位为0 s=s^mask)
2 不引入第三变量,交换两个变量的值 (设 a=a1,b=b1)
目 标 操 作 操作后状态
a=a1^b1 a=a^b a=a1^b1,b=b1
b=a1^b1^b1 b=a^b a=a1^b1,b=a1
a=b1^a1^a1 a=a^b a=b1,b=a1
二进制补码运算公式:
-x = ~x + 1 = ~(x-1)
~x = -x-1
-(~x) = x+1
~(-x) = x-1
x+y = x – ~y – 1 = (x|y)+(x&y)
x-y = x + ~y + 1 = (x|~y)-(~x&y)
x^y = (x|y)-(x&y)
x|y = (x&~y)+y
x&y = (~x|y)-~x
x==y: ~(x-y|y-x)
x!=y: x-y|y-x
x< y: (x-y)^((x^y)&((x-y)^x))
x<=y: (x|~y)&((x^y)|~(y-x))
x< y: (~x&y)|((~x|y)&(x-y))//无符号x,y比较
x<=y: (~x|y)&((x^y)|~(y-x))//无符号x,y比较
应用举例
(1) 判断int型变量a是奇数还是偶数
a&1 = 0 偶数
a&1 = 1 奇数
(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1
(3) 将int型变量a的第k位清0,即a=a&~(1<<k)
(4) 将int型变量a的第k位置1, 即a=a|(1<<k)
(5) int型变量循环左移k次,即a=a<<k|a>>16-k (设sizeof(int)=16)
(6) int型变量a循环右移k次,即a=a>>k|a<<16-k (设sizeof(int)=16)
(7)整数的平均值
对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:
- int average(int x, int y) //返回X,Y 的平均值
- {
- return (x&y)+((x^y)>>1);
- }
(8)判断一个整数是不是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)
a * (2^n) 等价于 a<< n
(13)除法运算转化成位运算 (在不产生溢出的情况下)
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)
最后补充一些关于二进制位移操作
PHP主要是设计于文本操作的,其实PHP不适合做数学运算,效率也不高,不过因为这次的项目中有个东西必须使用到二进制位移操作,在PHP上面遇到了一些麻烦。
因为PHP只有32位有符号整数,没有64位长整型,也没有无符号整数。其整型的范围是-231-1~231,超出这个范围的,将被解释为浮点数。因此,0xFFFFFFFF,直接打印,显示的是4294967295,及232:
>> 0xFFFFFFFFF
4294967295
>> gettype(0xFFFFFFFF)
'double'
而在32位有符号整型中,0xFFFFFFFF应表示-1:
>> (int)0xFFFFFFFFF
-1
而PHP不支持浮点数的二进制位移操作,如果要进行,会先转换为整型,最后的结果,也将按照整型来返回:
- >> 1 << 31
- -2147483648
- >> 1 << 30
- 1073741824
- >> 1 << 32
- 1
- >> 0xFFFFFFFF >> 1
- -1
同时PHP的向右位移操作,高位会填充符号位,而且PHP没有提供类似Java的>>>来强制填充0:
- >> 1 << 32
- 1
- >> 0xFFFFFFFF >> 1
- -1
- >> 0xFFFFFFFF >> 2
- -1
- >> 0xFFFFFFFF >> 3
- -1
- >> 0xFFFFFFFF >> 31
- -1
如何解决这个问题呢,我考虑过使用BCMath数学函数库,直接处理字符串表示的整数,或者是GMP/BigInt扩展等。不过我想既然使用字符串,那么我可以字符串地彻底一些,把数字转换成32个二进制的字符串,再手工填充0,最后转换回来。
不知道哪位有更好的方法,请告诉我,另外,其实代码可以扩展为任意位2进制的位移操作,这里我没有做,PHP代码如下:
- <?php
- /**
- * 无符号32位右移
- * @param mixed $x 要进行操作的数字,如果是字符串,必须是十进制形式
- * @param string $bits 右移位数
- * @return mixed 结果,如果超出整型范围将返回浮点数
- */
- function shr32($x, $bits){
- // 位移量超出范围的两种情况
- if($bits <= 0){
- return $x;
- }
- if($bits >= 32){
- return 0;
- }
- //转换成代表二进制数字的字符串
- $bin = decbin($x);
- $l = strlen($bin);
- //字符串长度超出则截取底32位,长度不够,则填充高位为0到32位
- if($l > 32){
- $bin = substr($bin, $l – 32, 32);
- }elseif($l < 32){
- $bin = str_pad($bin, 32, '0', STR_PAD_LEFT);
- }
- //取出要移动的位数,并在左边填充0
- return bindec(str_pad(substr($bin, 0, 32 – $bits), 32, '0', STR_PAD_LEFT));
- }
- /**
- * 无符号32位左移
- * @param mixed $x 要进行操作的数字,如果是字符串,必须是十进制形式
- * @param string $bits 左移位数
- * @return mixed 结果,如果超出整型范围将返回浮点数
- */
- function shl32 ($x, $bits){
- // 位移量超出范围的两种情况
- if($bits <= 0){
- return $x;
- }
- if($bits >= 32){
- return 0;
- }
- //转换成代表二进制数字的字符串
- $bin = decbin($x);
- $l = strlen($bin);
- //字符串长度超出则截取底32位,长度不够,则填充高位为0到32位
- if($l > 32){
- $bin = substr($bin, $l – 32, 32);
- }elseif($l < 32){
- $bin = str_pad($bin, 32, '0', STR_PAD_LEFT);
- }
- //取出要移动的位数,并在右边填充0
- return bindec(str_pad(substr($bin, $bits), 32, '0', STR_PAD_RIGHT));
- }
- ?>
波比源码 » php移位运算、移位操作学习笔记
levaquin canada order levofloxacin 250mg pills
order generic dutasteride order avodart 0.5mg pill generic zofran
order aldactone generic oral fluconazole diflucan 200mg pill
ampicillin 250mg without prescription buy erythromycin generic erythromycin 250mg without prescription
order sildenafil 50mg pill methocarbamol order methocarbamol 500mg uk
order sildenafil buy sildenafil 50mg estrace 1mg tablet
lamotrigine over the counter buy lamotrigine 200mg pills retin cream without prescription
purchase tadalis online cheap order tadalafil 10mg voltaren buy online
isotretinoin 10mg uk buy amoxil 1000mg online generic azithromycin
buy indomethacin 75mg online lamisil 250mg pills trimox 500mg us
order cialis 20mg for sale natural ed viagra pills 50mg
cheap arimidex 1 mg US viagra sales sildenafil generic
buy prednisone 20mg online cheap viagra mail order usa over the counter viagra
tadalafil 10mg kaufen ohne rezept sildenafil 50mg generika rezeptfrei kaufen original viagra 100mg rezeptfrei sicher kaufen
doxycycline 200mg pills clomid generic lasix tablet
buy ramipril irbesartan price azelastine 10ml price
buspar canada buy amiodarone generic buy oxybutynin 2.5mg pills
prograf 5mg price urso 300mg uk urso 300mg uk
buy zyban 150mg without prescription atomoxetine us cheap quetiapine
sertraline 50mg tablet buy kamagra 200mg pills sildenafil 100mg pills for men
imuran price buy viagra 50mg generic sildenafil 50mg for sale
tadalafil 5mg canada fluoxetine without prescription buy viagra 100mg pills
cialis overnight delivery buy cialis pills amantadine price
order naltrexone 50mg generic order albenza sale order aripiprazole generic
buy provera 10mg for sale buy provera 10mg for sale periactin generic
buy modafinil order modafinil pills ivermectin 3mg online
cheap fluvoxamine duloxetine order order glucotrol 5mg sale
isotretinoin 20mg over the counter buy amoxicillin 500mg pill order deltasone pills
order piracetam 800 mg sale buy sildenafil 100mg without prescription oral sildenafil 100mg
buy tadalafil 40mg sale cheap cialis 5mg sildenafil 100mg drug
buy furosemide 100mg generic doxycycline generic hydroxychloroquine 200mg canada
buy tadalafil 20mg buy generic betnovate 20 gm clomipramine buy online
itraconazole usa sporanox 100 mg pills order generic tindamax 500mg
glycomet online cialis tadalafil order tadalafil 10mg generic
order generic olanzapine 10mg zyprexa 10mg generic order valsartan 160mg online
female viagra sildenafil lisinopril uk buy lisinopril 2.5mg generic
prilosec uk free online blackjack no download gambling game
cost metoprolol metoprolol oral order levitra 10mg without prescription
term papers help best casino slots online ocean casino online
cheap thesis binding viagra 100mg cheap purchase sildenafil generic
buy clomid 50mg casinos online world series of poker online
buy tadalafil 10mg cialis without prescription sildenafil 100mg without prescription
buy dapoxetine 60mg pill misoprostol brand buy synthroid 100mcg online
cialis for women sildenafil for sale viagra overnight
purchase zyloprim generic crestor buy zetia 10mg pills
lioresal sale buy toradol 10mg without prescription toradol ca
order colchicine 0.5mg generic colchicine 0.5mg for sale casino bonus
zantac 150mg sale order celecoxib 100mg online buy celebrex 100mg online cheap
online casinos for real money blackjack for money empire city casino online
flomax 0.2mg usa spironolactone 100mg for sale buy spironolactone 25mg online
cialis 5mg oral how to get cialis oral cipro
cephalexin brand buy cleocin 150mg generic buy erythromycin 500mg sale
order viagra pills order viagra 100mg online order cialis 40mg online cheap
hollywood casino online real money tadalafil 20mg price buy tadalafil 40mg generic
order trazodone without prescription buy generic suhagra 100mg sildenafil order online
sildenafil overnight shipping estrace 1mg uk buy lamictal generic
azithromycin tablet gabapentin 800mg pills gabapentin online
casino online slots stromectol order buy modafinil 200mg
buy lasix pill buy furosemide 40mg generic plaquenil 400mg cost
buy sildenafil without prescription tamoxifen 20mg uk purchase rhinocort generic
tretinoin price retin cream cost avanafil 100mg oral
tadacip online order purchase diclofenac sale indomethacin canada
buy terbinafine 250mg without prescription brand amoxicillin amoxicillin 250mg without prescription
clarithromycin brand order clonidine generic purchase meclizine pill
cialis 20 mg cialis 40mg tablet buy generic tadalafil 5mg
stromectol price stromectol 6mg us generic avlosulfon
cost nifedipine 30mg adalat pills buy fexofenadine 120mg for sale
casino online games for real money canada pharmaceuticals online help with papers
altace tablet buy altace etoricoxib buy online
asacol for sale asacol tablet buy irbesartan 300mg
carvedilol over the counter purchase elavil generic order amitriptyline for sale
nortriptyline 25 mg oral order paxil cheap paxil 10mg
Thank you for great article. Hello Administ . Metropol Halı Karaca Halı Öztekin ve Selçuklu Halı Cami Halısı ve Cami Halıları Türkiye’nin En Büyük Cami Halısı Fabrikasıyız…
requip 2mg sale cheap trandate purchase labetalol pills
esomeprazole for sale online clarithromycin over the counter furosemide 40mg without prescription
fenofibrate brand order viagra 50mg generic sildenafil 100mg pills for men
buy modafinil 200mg sale stromectol 12mg drug promethazine 25mg sale
buy fildena 100mg generic buy ed pills proscar 5mg us
order isotretinoin 40mg buy generic isotretinoin 10mg purchase azithromycin online
albuterol order online augmentin usa buy clavulanate
prednisolone 10mg oral prednisolone 10mg usa purchase lasix pills