关于按位运算的最基本的介绍

    首先计算机内的数据和指令都是以二进制的形式存储的,而有些运算便是以二进制而基础进行的。比如按位运算。但是按位运算并不是只能作用于二进制数,其他数也会被转化为二进制后再进行相应的运算。

    首先明白有哪些运算符及其基本的作用方法。

1.or 运算 即‘|’运算

or运算为整数的二进制形式的每位进行对齐后,如果有一个是1则运算后的结果就为1否则为0

例如 1011|0001=1011;1111|0000=1111;即11|1=11;15|0=15;

2.and 运算 即‘&’运算

and运算为只要相同位有一位为0则该位为0;(与or运算相反)

例如 1011&0001=0001;1111&0000=0000;即11&1=1;15&0=0;

3.xor 运算 即‘^’运算

xor运算为每位如果相同则为0,不同则为1;

例如1011^0001=1010;1111^0000=1111;即11^1=10;15^0=15;

4.not 运算 即‘~’运算(只对单个作用)

如果该整数为无符号整数则not运算为对该整数中的0和1取反;

(注意负数在存储中是以补码形式存在)

例如~1011=0100;~1111=0000;即~11=4;~15=0;~-1=0;~-2=1;

5.shl 运算 即 '<<'运算

将整数转化为二进制后向左平移n位,同时在后面添加n个0;

例如1011<<2=101100;1111<<2=111100;即11<<2=44;15<<2=60;

(此时未考虑到所有的位数以及上位的溢出,故类似移一位×2一次)

6.shr 运算 即‘>>’运算

将整数转化为整数后向右平移n位,同时在前面添加

a.如果为无符号整数则添加0

b.若为有符号整数则用符号位填写左边的空位(正数为0,负数为1)

例如00000000 00000000 00000000 00000001>>1=00000000 00000000 00000000 00000000

10000000 00000000 00000000 00000001>>1=11000000 00000000 00000000 00000000

这里在进行十进制等负数运算时需注意负数是以整数的补码的形式存在,不能直接平移

再来进行其有关功能的展示

1.and 运算 即’&‘运算

用于二进制取位操作;(可以取任意指定位,利用1的位置)

任何数n&1后得到的结果为其二进制的最后一位;

2.or 运算 即’|‘运算

用于改写指定位操作;(可以改写任意指定位,利用1的位置)

任何数n&1后得到的结果为将最末尾强行变为1;

若要改为0则再进行加减;

3.xor 运算 即’^‘运算

a.xor运算的逆运算是其本身,故可用作加密。

一串数字用key进行xor运算后得到的结果在用相同一次xor运算便可得到原来的数据

b.可用于两数据间的交换(无需中间变量)自己作为自己的中间变量

4.shl 运算 即‘<<’运算

a.定义为2的n次幂的常量

b.用于代替*2操作,因为其涉及的是更底层的操作,故其运行效率更高

5.shr 运算 即‘>>’运算

同上,用于代替/2操作,提高程序运行效率(在涉及负数时应先转化为正数再运算)

运算中所需考虑到的优先级:(从左到右优先级递减)

~  <<(>>)  &  ^  |  &=(等涉及到赋值操作的所有)

简单应用:

去掉最后一位 | (101101->10110) | x shr 1
在最后加一个0 | (101101->1011010) | x shl 1
在最后加一个1 | (101101->1011011) | x shl 1+1
把最后一位变成1 | (101100->101101) | x or 1
把最后一位变成0 | (101101->101100) | x or 1-1
最后一位取反 | (101101->101100) | x xor 1
把右数第k位变成1 | (101001->101101,k=3) | x or (1 shl (k-1))
把右数第k位变成0 | (101101->101001,k=3) | x and not (1 shl (k-1))
右数第k位取反 | (101001->101101,k=3) | x xor (1 shl (k-1))
取末三位 | (1101101->101) | x and 7
取末k位 | (1101101->1101,k=5) | x and (1 shl k-1)
取右数第k位 | (1101101->1,k=4) | x shr (k-1) and 1
把末k位变成1 | (101001->101111,k=4) | x or (1 shl k-1)
末k位取反 | (101001->100110,k=4) | x xor (1 shl k-1)
把右边连续的1变成0 | (100101111->100100000) | x and (x+1)
把右起第一个0变成1 | (100101111->100111111) | x or (x+1)
把右边连续的0变成1 | (11011000->11011111) | x or (x-1)
取右边连续的1 | (100101111->1111) | (x xor (x+1)) shr 1
去掉右起第一个1的左边 | (100101000->1000) | x and (x xor (x-1))

原文链接:https://blog.csdn.net/qq51931373/article/details/38382359

进阶介绍以后补充

  • 4
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值