首页 > 其他分享 >通过位运算修改指定bit位的值

通过位运算修改指定bit位的值

时间:2022-10-27 19:59:12浏览次数:75  
标签:运算 指定 修改 异或 bit 位设

通过位运算修改指定bit位的值

问题样例

假如现在有一个8bit二进制数A,其可以为任何值,所以这里不妨先设A=(xxxxxxxx)2,{x|0,1}

现在需要你将A修改为A=(x111x00x)2,并且不使用任何的分支和跳转判断语句实现。

要解决这个问题我们需要用到异或、与、或三种位运算,其中异或运算是解决问题的核心。

异或运算的性质

异或运算的真值表如下

a b a⊕b
0 0 0
0 1 1
1 0 1
1 1 0

上面的真值表反映出了一个规律,也是异或运算中重要的性质

  • x ⊕ 0 = x
  • x ⊕ 1 = !x

根据这个性质我们也可以简单地推导出异或运算的可逆性,也就是 x ⊕ y ⊕ y = x

解决过程

题目中将A修改为A=(x111x00x)2,部分位设1,部分位设0,而设1和设0需要分别来进行

第一步:指定位设1

接下来我们先要用到上文中提到的异或运算的两个性质

  • x ⊕ 0 = x
  • x ⊕ 1 = !x

根据这个性质构造一个新的二进制数,我们可以称它为B

构造B时我们需要将想要改变的位设1,其他不变的位设0

这一步中,我们将A=(xxxxxxxx)2修改为A=(x111xxxx)2,由此构造B=(01110000)2

接下就是见证奇迹的时刻

用C表示AB异或的结果C=A⊕B=(x [!x] [!x] [!x] xxxx)2

这时候再将AC进行或运算,A|C=([x|x] [x|!x] [x|!x] [x|!x] [x|x] [x|x] [x|x] [x|x])2=(x111xxxx)2

其实这时候你应该也可以看出来了,如果将最后的或运算改位与运算,那么就可以把指定为设定位0

第二步:指定位设0

那么我们的第二步的做法就很明显了

首先构造B=(00000110)2

再将AB进行异或C=A⊕B=(xxxxx [!x] [!x] x)2

最后AC进行与运算,A&C=([x&x] [x&x] [x&x] [x&x] [x&x] [x&!x] [x&!x] [x&x])2=(xxxxx00x)2

这样两步下来之后我们便成功将A=(xxxxxxxx)2设为了(x111xx00x)2

本文编辑于2022年10月22日

最近修改于2022年10月27日

标签:运算,指定,修改,异或,bit,位设
From: https://www.cnblogs.com/ThousandPine/p/16833507.html

相关文章

  • Python RabbitMQ pika的安装及fanout消息订阅模式的使用
    RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件,RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有......
  • rabbitmq 添加用户和权限分配
      添加账号密码,注意tags是权限角色,有五个角色选择,admin是权限最大的管理员,none是不能访问,建议练习赋予admin权限然后添加一个新的虚拟主机,设置权限: ......
  • 记一次Oracle返回指定保留小数的数字问题
    1问题背景在Oracle中,根据数据库中配置的保留小数位数,给数据保留对应的位数2Oracleto_char函数格式化数字用法介绍「参数说明」参数说明示例9存在数字显......
  • C#中的 `true` 和 `false` 运算符
    C#中的true和false运算符基础用法我们先定义一个示例用的类publicclassBoolTest{publicintX{get;set;}publicBoolTest(intx){X=x;}publ......
  • 【HDLBits刷题日记】07 Multiplexer&Arithmetic adder
    Mux2to1moduletop_module(inputa,b,sel,outputout);assignout=sel?b:a;endmoduleMux2to1v100位和1位的是一样的。moduletop_module(......
  • xml获取指定标签的集合
    一、pom依赖<!--dom4j的jar包--><dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId>......
  • 运算符重载
    #include<iostream>usingnamespacestd;classComplex{public: Complex(){real=0;imag=0;} Complex(doubler,doublei){real=r;imag=i;} doubleget_real(){r......
  • python的一些运算符
    #1.算术运算符print('1.算术运算符')#1.1+求和a=10b=20c=a+bprint(c)print('a+b={}'.format(c))print('a+b=%i'%c)print(f'a+b={c}')#1.2-求......
  • nrf52840 设置128bit服务uuid
    sdk版本:nRF5_SDK_17.1.0_ddde560主要更改以下函数:uint32_tble_nus_init(ble_nus_t*p_nus,ble_nus_init_tconst*p_nus_init){ret_code_terr_code;b......
  • bitset容器找出0~n-1中重复的那个数字
    题目描述一组无序的自然数集合,由0,1,2......,n的数字和一个的数字X(X>=0&&X<=n)组成,请从集合中找出这个重复数字X。输入描述:空格分割的自然数集合输出描述:重复数字......