c++的位移运算

异或运算

两个相同的数会消掉 可以在相同的数中找不同的数

#include <iostream>
#include <random>
#include <ctime>
#define N 10
using namespace std;
int main() {
    mt19937_64 e(time(0));
    uniform_real_distribution <double> dis(1,N-1);
   int arr[N];
   for (size_t i = 0; i <N; i++)
   {
    arr[i]=i;
   }
   arr[N-1]=dis(e);
    for (size_t i = 0; i < N; i++)
  {
   cout<<arr[i]<<"  ";
   }

   int temp;int index=dis(e);
   temp=arr[N-1];
   arr[N-1]=arr[index];
   arr[index]=temp;
   
   
   int x1=0;
    for (size_t i = 0; i < N-1; i++)
    {
     x1=(x1^i);
    }
   for (size_t i = 0; i < N; i++)
   {
    x1=x1^arr[i];
   }
   
cout<<endl;
   cout<<x1<<endl;
   
    return 0;
}

首先利用c++产生随机数 然后给定一个数组利用循环遍历赋值最后一个是随机数

然后再将随机数给到数组中随机分配最后随机分配打印输出

2。利用异或交换两个数字

#include<iostream>
using namespace std;
int main()
{
    int a=90;
    int b=80;
    a=a^b;
    b=a^b;
    a=a^b;
    std::cout<<"a的值为";
    cout<<a<<endl;
    cout<<"b的值为";
    cout<<b<<endl;
    return 0;
}

利用两数相消原理a=a^b  在^a则b变成了b=a

然后a再^b则是 a=b

【2】 & 在位移中的操作

利用按位与 判断奇偶性

& 在运算中是是全为1才为1否则为0

利用这个在二进制中与1进行运算

00000000000001

1111111111111111

无论这两个数是几都会被前边都会被消掉与最后的1进行判断如果是偶数1会被消掉变成0

如果是奇数1会被保留变成1

结果为

 

### C++ 中负数的位移运算规则及行为 在 C++ 中,位移运算是指通过 `<<` 和 `>>` 运算符对整数值进行二进制级别的移动操作。对于正数而言,其行为通常是明确定义且可预测的;然而,当涉及到 **负数** 的位移运算时,情况会变得复杂一些。 #### 左移 (`<<`) 对于负数的行为 C++ 标准并未明确规定负数左移的具体行为[^3]。通常情况下,编译器会对负数先转换为其对应的补码形式,然后再执行左移操作。需要注意的是: - 如果尝试将负数左移,则结果可能依赖于具体的实现细节。 - 在某些平台上,可能会引发未定义行为 (Undefined Behavior),尤其是在高位被截断的情况下。 以下是示例代码展示负数左移的操作: ```cpp #include <iostream> using namespace std; int main() { int num = -1; int result = num << 1; // 将 -1 的补码形式向左移动一位 cout << result; // 输出结果取决于具体平台和编译器 } ``` 由于 `-1` 的补码表示为全 `1`(即 `1111...1111`),将其左移一位相当于丢弃最高有效位并填充零到最低有效位上。最终结果可能是不可预期的,因为这完全由硬件架构决定。 --- #### 右移 (`>>`) 对于负数的行为 针对右移操作,C++ 提供了两种主要模式:逻辑右移与算术右移。其中,**算术右移** 是处理负数的标准方式之一,在大多数现代处理器中都支持该特性。 - 当应用算术右移至负数时,符号位会被保留下来,并复制到左侧新产生的空缺位置处。这种机制可以保持原始值的符号不变。 下面是一个例子演示如何利用算术右移来处理负数: ```cpp #include <iostream> using namespace std; int main() { int num = -8; // 原始数据 (-8) int result = num >> 1; // 执行一次算术右移 cout << result; // 预期输出应接近原数值的一半(-4),但实际效果仍需视乎环境而定. } ``` 理论上讲,上述程序应当打印出 `-4`,这是因为采用了算术右移方法保存了原有的符号信息。不过值得注意的是,不同机器或者编译环境下可能存在差异性表现。 另外还需强调一点就是关于超出范围之后溢出问题以及边界条件下的特殊情况都需要额外小心对待以免造成错误计算或者是安全漏洞等问题发生. --- #### 总结注意事项 综上所述,虽然部分常见场景下我们可以大致推测出负数参与位移后的大概趋势走向,但由于缺乏统一强制性的规定加上跨平台移植过程中不可避免存在的兼容性隐患等因素影响,建议开发者尽量避免让负数参与到任何形式上的直接位元变换当中去除非绝对必要并且已经充分验证过当前所使用的工具链能够正确无误地解释这些指令含义才行.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值