首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

什么时候在C++中改变一个值的位?

在C++中,当您需要改变一个值的位时,可以使用位操作符。以下是一些常用的位操作符及其用法:

  1. 按位与(&):用于比较两个数的二进制表示,并将结果中的每一位设置为1,当且仅当对应的输入位都为1。
  2. 按位或(|):用于比较两个数的二进制表示,并将结果中的每一位设置为1,当且仅当对应的输入位至少有一个为1。
  3. 按位异或(^):用于比较两个数的二进制表示,并将结果中的每一位设置为1,当且仅当对应的输入位不同。
  4. 按位取反(~):用于反转一个数的二进制表示,将0变为1,将1变为0。
  5. 左移(<<):用于将一个数的二进制表示向左移动指定的位数,右侧用0填充。
  6. 右移(>>):用于将一个数的二进制表示向右移动指定的位数,左侧用符号位填充。

以下是一些使用位操作符的示例:

代码语言:cpp
复制
#include<iostream>
using namespace std;

int main() {
    int a = 5; // 二进制表示:00000101
    int b = 3; // 二进制表示:00000011

    // 按位与
    int c = a & b; // 结果:00000001,c = 1

    // 按位或
    int d = a | b; // 结果:00000111,d = 7

    // 按位异或
    int e = a ^ b; // 结果:00000110,e = 6

    // 按位取反
    int f = ~a; // 结果:11111010,f = -6

    // 左移
    int g = a << 2; // 结果:00010100,g = 20

    // 右移
    int h = a >> 1; // 结果:00000010,h = 2

    return 0;
}

通过使用位操作符,您可以轻松地改变一个值的位,以实现高效的数据处理和操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JAVA 位操作

【引自黑马王子的博客】Java中的位操作指定包括:
~ 按位非(NOT)
& 按位与(AND)
| 按位或(OR)
^ 按位异或(XOR)
>> 右移
>>> 无符号右移
<<左移
前面几个都非常简单,主要是移位操作比较容易出错.
首先要搞清楚参与运算的数的位数,如int的是32位。long的是64位。
如int i = 1;
i的二进制原码表示为:
00000000000000000000000000000001
long l = 1;
l的二进制原码表示为:
0000000000000000000000000000000000000000000000000000000000000001
二、

正数没有反码、补码,也可以说正数的反码、补码跟原码一样。
负数的反码为原码逐位取反,
如int i = -1;
10000000000000000000000000000001,最高位是符号位。正数为0,负数为1。
逐位取反后:
01111111111111111111111111111110即反码。
反码加1:
01111111111111111111111111111111即补码。
负数都是用补码参与运算的。得到的也是补码,需要减1取反获得原码。

三、常用的位运算符–0在位运算中是比较特殊的。

^ 异或。 相同为0,相异为1; 任何数与0异或都等于原值。 
& 与。 全1为1, 有0为0;任何数与0异或都等于0。
| 或。 有1为1, 全0为0。任何数与0或都等于原值。
<<左移。 补0。
>> 右移。 符号位是0补0,是1补1。
>>>无符号右移。补0。
~ 非 逐位取反

四、负数参与的运算,得到的是补码,需要将补码先减1,然后逐位取反,得到原码。即为运算结果。

0例外,如果得到的是0,则不需减1和取反。
另外,两个正数运算后得到的就是原码,不需减1和取反。
举例:
1^-1,
-1
10000000000000000000000000000001–原码
01111111111111111111111111111110–反码
01111111111111111111111111111111–补码
1
00000000000000000000000000000001–原码
则1^-1等于
01111111111111111111111111111111^
00000000000000000000000000000001=
01111111111111111111111111111110–补码
01111111111111111111111111111101–反码
10000000000000000000000000000010–原码==-2
即1^-1=-2
举例:
1^-2
-2
10000000000000000000000000000010–原码
01111111111111111111111111111101–反码
01111111111111111111111111111110–补码
1
00000000000000000000000000000001–原码
则1^-2等于
01111111111111111111111111111110^
00000000000000000000000000000001=
01111111111111111111111111111111–补码
01111111111111111111111111111110–反码
10000000000000000000000000000001–原码==-1
1.<<
逻辑左移,右边补0,符号位和其他位一样.
正数:
x<<1一般相当于2x,但是可能溢出.
溢出范围: 230~(231-1) 二进制表示 010000…000到01111….1111,移位后最高为变为1了,变成负数了.
负数:
x<<1一般也相当于2x,也有可能溢出.所以, x*32可以写成x<<5
溢出范围: -231~-(230+1)

03

疯子的算法总结(一) 位运算(快速幂、快速乘)

计算机通过二进制表示整形数,比如int型32位有符号整形数: 1表示为:0000…00001(共32位) -1表示为:1111…1111(共32位) 补码计算法定义:非负数的补码是其原码本身; 负数的补码是其绝对值的原码最高位符号位不变,其它位取反,再加1。 表示原因:计算机逻辑运算没有减法,-1+1最高为溢出,剩余0000000000(32位)即为0; 则有a-b=a+b的(补码); 计算方式: -1表示原码为100…0001(32位),最高位位符号位。 -1的反码表示为:1111…110(32位),除符号位按位取反。 -1的补码表示为:1111…1111(32位),反码+1。 正数的补码为自己本身。 例子: 100的补码‭00000000000000000001100100‬ -30的补码 11111111111111111111111100010‬ 100+(-30)=000000000000000000‭01000110‬ 转换成10进制为70;

03
领券