位运算笔记

1.按位取反

按位取反是指对一个数中的每一位进行取反操作,也就是将 0 变成 1,将 1 变成 0。在 C++ 中,使用按位取反符号 ~ 来实现。

例如,如果有一个二进制数 00101011,则它的按位取反结果为 11010100,因为每个位上的 0 和 1 都被取反了。用 C++ 的话,可以这样写代码:

unsigned char num = 0x2B;  // 定义一个二进制数 00101011
unsigned char result = ~num;  // 对 num 进行按位取反操作

其中,num 表示对 num 进行按位取反操作,得到的结果是一个无符号字符类型。

2.按位与

按位与(Bitwise AND)是一种二进制运算符,用于将两个整数的对应位进行逻辑与操作。在位与运算中,如果对应位置的两个位都为1,则结果为1,否则为0。

例如,将十进制数5(二进制表示为101)和3(二进制表示为011)进行按位与运算:

101 (5的二进制)
011 (3的二进制)
001(结果为1)

因此,5与3的按位与结果为1。

按位与运算在计算机科学中有多种应用,例如:

  • 用于数据掩码,通过与操作可以屏蔽或提取特定的位;
  • 用于位字段操作,可以通过与操作来设置或清除特定的位;
  • 用于位运算,可以高效地进行数字操作,如判断奇偶性、取模等。

需要注意的是,按位与运算只能对整数进行操作,不能用于浮点数或其他非整数类型。

好现在我再来详细解释一下。

按位与是一种二进制运算符,表示为"&",它的操作数可以是任何类型,但首先需要将其转换为二进制形式。对于每一位,如果两个操作数都是1,则结果为1;否则,结果为0。例如,对于两个字节(即8位二进制数)11001010和10110011,它们的按位与结果如下:

 11001010

& 10110011

 10000010

按位与运算符通常用于屏蔽或提取特定的位。例如,假设我们有一个16位整数值,其中前10位代表某个数字的整数部分,后6位代表该数字的小数部分。我们想要提取整数部分,可以使用按位与运算符和一个适当的掩码来实现。适当的掩码是一个与所有整数部分位都为1,其他位为0的数。例如,对于0xFFFF(16位全1),它的二进制形式为1111111111111111,因此我们可以用它作为掩码,与原始值进行按位与运算,从而得到整数部分:

int number = 0xABCD1234; // 假设这是我们要处理的值
int integerPart = number & 0xFFFFC000; // 0xFFFFC000表示所有整数部分位都是1,其他位都是0
// integerPart现在包含number的整数部分,其余位都为0

类似地,如果我们想屏蔽一个值的最低4位,可以使用掩码0xFFFFFFF0(所有最低4位为0,其他位为1):

int number = 0xABCD1234;
int maskedValue = number & 0xFFFFFFF0; // maskedValue现在等于number,除了最低4位都是0

在计算机科学中,按位与运算还有其他用途。例如,它可以用于位运算,如判断奇偶性、取模等。回到最开始举的例子,如果我们想判断一个整数是否为奇数,可以将它与1进行按位与运算。由于奇数的最低位总是1,所以结果为1;而偶数的最低位总是0,所以结果为0:

int number = 13;
bool isOdd = (number & 1) != 0; // isOdd现在等于true

综上所述,按位与运算在计算机科学中有多种应用,它可以很好地处理数字并提高代码效率。

3.按位或

按位或(Bitwise OR)是一种二进制运算符,用于将两个整数的对应位进行逻辑或操作。在位或运算中,如果对应位置的两个位中至少有一个为1,则结果为1,否则为0。

例如,将十进制数5(二进制表示为101)和3(二进制表示为011)进行按位或运算:

101 (5的二进制)
011 (3的二进制)
111(结果为7)

因此,5和3的按位或结果为7。

按位或运算也有多种应用,例如:

  • 用于设置特定位,可以将某些位设置为1;
  • 用于合并数据,可以将两个数据的相应位合并成一个新的值;
  • 用于位运算,可以高效地进行数字操作,如判断某些位是否为1等。

需要注意的是,按位或运算只能对整数进行操作,不能用于浮点数或其他非整数类型。同时,它也不会改变操作数本身,而是生成一个新的值作为结果。

我来详细解释一下按位或运算。

按位或运算是一种二进制运算符,用于对两个整数的对应位进行逻辑或操作。对于每一位,只要其中至少有一个为1,则结果位就为1;只有在两个位都是0时,结果位才为0。

具体来说,假设我们有两个整数a和b,它们的二进制表示分别为:
a = a[n-1]a[n-2]…a[2]a[1]a[0]
b = b[n-1]b[n-2]…b[2]b[1]b[0]

其中,n表示二进制位数。

那么,a和b的按位或结果c的二进制表示为:
c = c[n-1]c[n-2]…c[2]c[1]c[0]
其中,c[i] = a[i] | b[i] 表示对应位的按位或结果。

举个例子来说明,假设我们有两个整数17和12:
17的二进制表示为:10001
12的二进制表示为:01100

现在我们对它们进行按位或运算:
10001 (17的二进制)

01100 (12的二进制)
11101 (结果为29)

因此,17和12的按位或结果为29。

按位或运算也有一些常见的用途,例如:

  • 设置特定位:可以将某些特定的位设置为1,例如可以通过对一个数与上特定的掩码(对应位为1,其他位为0)进行按位或,将指定位设置为1;
  • 合并数据:可以将两个数据的相应位进行按位或操作,得到一个新的值,这在一些数据合并的场景中很常见;
  • 位运算:可以高效地进行数字操作,例如判断某些位是否为1等。

需要注意的是,按位或运算只能操作整数类型,不能用于浮点数或其他非整数类型。同时,按位或运算不会改变操作数本身,而是生成一个新的值作为结果。

4.异或运算

异或运算(XOR,Exclusive OR)是一种逻辑运算符,用于比较两个值的不同之处。它的运算规则如下:

如果两个比较的值相同,则返回结果为0;

如果两个比较的值不同,则返回结果为1。

异或运算可以用符号“^”表示。例如:

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

异或运算在计算机科学和电子工程中广泛应用,常用于编程语言中的位运算或逻辑运算。它具有一些有趣的性质,例如可以用来交换两个变量的值,或者判断一个二进制数字中有多少个1等。

当你想对两个数进行异或运算时,可以按照以下步骤进行操作:

1.将两个数转换为二进制形式。如果两个数的位数不同,则在较短的数前面补零,使它们具有相同的位数。

2.从左到右逐位比较这两个二进制数的对应位。

3.如果两个对应位相同(都是0或都是1),则该位的结果为0;如果两个对应位不同,则该位的结果为1。

4.将得到的二进制结果转换回十进制形式,即为异或运算的结果。

举个例子,假设我们要计算10和6的异或运算:
首先,将10和6转换为二进制表示:
10的二进制表示为1010
6的二进制表示为0110

然后,对应位进行按位异或运算:
1010 (10的二进制)
^ 0110 (6的二进制)

1100 (结果为12)

因此,10和6的按位异或结果为12。

异或运算的规则是,对应位上的两个数,如果相同则结果为0,不同则结果为1。

希望这个例子能够帮助你理解异或运算。如果你还有其他问题,请随时提出。

5.左右移位

左移位和右移位是位运算中常见的操作。

左移位(<<)是将一个数的二进制表示向左移动指定的位数。移动后,低位补0。每向左移动1位,相当于将原数乘以2。

例如,对于十进制数10(二进制表示为1010),将其左移2位:
1010 << 2
移位后得到:101000
结果为40,等价于将原数10乘以2的2次方。

右移位(>>)是将一个数的二进制表示向右移动指定的位数。移动后,高位补齐原符号位(即正数用0补齐,负数用1补齐)。每向右移动1位,相当于将原数除以2并取整。

例如,对于十进制数10(二进制表示为1010),将其右移2位:

1010 >> 2
移位后得到:0010
结果为2,等价于将原数10除以2的2次方。

左移位和右移位运算可以应用于各种场景,包括但不限于以下几点:

  • 在某些特定的位操作中,左移位和右移位可以高效地进行数值的倍增和倍除;
  • 在某些编码和解码过程中,移位运算可以提取或设置特定的位信息;
  • 在位字段操作中,移位运算可以将数据的各个部分移动到指定的位置。

请注意,移位运算可能会导致结果溢出或丢失精度。并且,在进行移位运算时需要注意数据类型以及移动的位数是否超出了合理的范围。

希望这个解释对你有所帮助。如有其他问题,请随时提问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值