问题描述

  2.6 编写一个函数setbits(x, p ,n, y),该函数返回对x执行下列操作后的结果值: 将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。

  Write a function setbits(x,p,n,y) that returns x with the n bits that begin at position p set to the rightmost n bits of y, leaving the other bits unchanged.

知识点复习

  1.按位与运算符(&)

    参加运算的两个数据,按二进制位进行“与”运算

    运算规则:0&0=0;  0&1=0;   1&0=0;    1&1=1;  (两位同时为“1”,结果才为“1”,否则为0)

      例如: 2 & 3

    换为二进制:0000 0010 & 0000 0011 = 00000010

    所以2 & 3 = 2

    (负数按补码形式参与按位与运算)

   2.按位或运算符( | )

    参加运算的两个对象,按二进制位进行“或”运算。

    运算规则:0|0=0;  0|1=1;  1|0=1;   1|1=1;(参加运算的两个对象只要有一个为1,其值为1)

    例如:2 | 3 

    换位二进制: 0000 0010 | 0000 0011 = 0000 0011

      所以2 | 3 = 3 

    (负数按补码形式参加按位或运算)

   3.按异或运算符( ^ )

    参加运算的两个数据,按二进制位进行“异或”运算。

    运算规则:0^0=0;  0^1=1;  1^0=1;   1^1=0;(参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0)

    例如:2 ^ 3

    换为二进制:0000 0010 ^ 0000 0011 = 0000 0001

    所以2 ^ 3 = 1

    异或运算符有一条有趣的性质,自反性:a ^ b ^ b = a

    利用这条性质,我们可以不用借助第三个变量,实现两个数值的交换

    例如交换a和b的值:

    

a = a ^ b;
b = a ^ b;
a = a ^ b;

    解释一下这个代码:

    第一句:令a = a^b

    第二局:b=a^b,其中的a用第一句的的等式替换 b = a^b^b=a

    第三句同理,a = a^b=a^a^b=b

   4.左移运算符(<<)
    将一个运算对象的各二进制位全部左移若干位,左边的二进制位丢弃,右边补0

    例:0000 0011<<2 = 0000 1100 左移2位,右补0

    若左移时舍弃的高位不包含1,则每左移一位,相当于该数十进制下乘以2

   5.右移运算符(>>)
    将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃

    操作数每右移一位,相当于该数十进制除以2

    左补0 or 补1得看被移数是正还是负

解题步骤

    这里我们直接用一个例子来解释这道题目:

    假设 setbits(93 , 4 , 3 , 211)

    93二进制:1 0 1 1    1 0 1

    211二进制:1 1 0 1    0 0 1 1

    按照题目要求,我们首先要找到93的第4位,也就是橙色标注的数字 1 0 1 1   1 0 1

   之后从这一位算起,往右数3位,,也就是橙色标注的数字  1 0 1 1   1 1 1

   我们要把上一行中橙色标注的这三位,替换为数字211二进制的最后三位

    红色标注的是211二进制的最后三位:1 1 0 1   0 0 1 1

   所以我们的最终目标就是把1 0 1 1    1 1 1 变成 1 0 0 1    1 1 1

代码如下

#include<stdio.h>

unsigned setbits(unsigned x, int p, int n, unsigned y)
{
return ((x & ~(~(~0 << n) << p+1-n)) | ((~(~0 << n) & y) << p+1-n));
}
int main()
{
printf("%d\n",setbits(93,4,3,211));
return 0;
}

  

运行结果

欢迎大家关注公众号:农大CPU

   

《C程序设计语言》 练习2-6 及 位运算总结的更多相关文章

  1. 全国计算机等级考试二级教程-C语言程序设计_第15章_位运算

    位运算,不适用于实数,仅仅适用于整数.字符. C语言的位运算只能操作整数.字符,实数是指数方式表示的,不适用于位运算. #define _CRT_SECURE_NO_WARNINGS #include ...

  2. C语言的移位操作符及位运算

    C语言的移位操作符 位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算.位移位运算符分为左移和右移两种,均为双目运算符.第一运算对象是移位对象,第二个运算对象是所移的二进制位数. 位 ...

  3. 操作系统和程序设计语言的API使用的字符编码分析

     1.Java的运行环境中,String是什么编码? 使用java做程序设计语言,字符编码是和jvm相关的,和操作系统无关. java默认的编码是jvm在安装的时候就确定了的,它是根据你的系统的环境确 ...

  4. 清风注解-Swift程序设计语言:Point6~10

    目录索引 清风注解-Swift程序设计语言 Point 6. 输出常量和变量 代码事例: // 输出的内容会在最后换行 println("hello, world") // 输出的 ...

  5. awk程序设计语言之-awk基础

    awk程序设计语言之-awk基础 http://man.linuxde.net/ 常用工具命令之awk命令 awk是一种编程语言,用于在Linux/Unix下对文本和数据处理.数据可以来自标准输入(s ...

  6. 《C程序设计语言》【PDF】下载链接:

    <C程序设计语言>[PDF]下载 https://u253469.pipipan.com/fs/253469-230382180 内容简介 在计算机发展的历史上,没有哪一种程序设计语言像C ...

  7. C程序设计语言笔记-第一章

     The C Programming language notes 一 基础变量类型.运算符和判断循环         char                 字符型  character      ...

  8. c++学习书籍推荐《C++程序设计语言(特别版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <C++程序设计语言(特别版•十周年中文纪念版)>编辑推荐:十周年纪念版,体味C++语言的精妙与魅力,享受与大师的心灵对话.1979年,Biarn ...

  9. C语言学习书籍推荐《C程序设计语言(第2版•新版)》下载

    克尼汉 (作者), 等 (作者, 译者), 徐宝文 (译者) 下载地址:点我 <C程序设计语言(第2版•新版)>是由C语言的设计者Brian W.Kernighan和Dennis M.Ri ...

随机推荐

  1. [GO] linux 下安装GO

    yum install mercurial安装 mercurial包 安装git包 yum install git 安装gcc yum install gcc 然后就可以下载golang的压缩包了 对 ...

  2. 《并发编程的艺术》阅读笔记之Volatile

    来源 在 JDK1.2 之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的.而在当前的 Java 内存模型下,线程可以把变量保存本地内存(比如机器的寄存器)中,而不 ...

  3. MVC-路由扩展-限制浏览器

    根据路由原理,MVC每次都会走获取路由上下文数据. 自定义Route 调用,以及完善其他代码 运行结果,当在谷浏览器执行时:

  4. Java 动态编译--DynamicCompiler

    java 动态编译自己写过程的机会比较少,记录一下: package com.xzlf.dynamicCompile; import java.io.IOException; import java. ...

  5. TT企业微信社群辅助,企业微信社群辅助工具,允许批量添加好友,自动同意添加请求,自动回复消息

    TT企业微信社群辅助,企业微信社群辅助工具,允许批量添加好友,自动同意添加请求,自动回复消息 界面截图 TT企业微信社群辅助工具下载 链接: https://pan.baidu.com/s/1Y2An ...

  6. Docker数据管理(一)

    数据卷挂载 在生产环境中,需要对数据进行持久化,冗余化,或者在需要在多个容器之间进行数据共享 数据卷:容器内数据直接映射到本地主机环境 数据卷容器:使同特定容器维护数据卷 -v 进行映射 1.在容器内 ...

  7. 【高并发】又一个朋友面试栽在了Thread类的stop()方法和interrupt()方法上!

    写在前面 新一轮的面试已经过去,可能是疫情的原因吧,很多童鞋纷纷留言说今年的面试题难度又提高了,尤其是对并发编程的知识.我细想了下,也许有那么点疫情的原因吧,但无论面试的套路怎么变,只要掌握了核心知识 ...

  8. 【React踩坑记六】create-react-app创建的react项目通过iP地址访问(实现局域网内访问)

    同项目组的小伙伴想用自己的电脑访问我电脑上开发阶段的create-react-app创建的react项目. 试过了了各种内网穿透工具ngrok以及localtunnel等. 奈何打开效率实在太过于龟速 ...

  9. stl的stack在开发中的应用

    栈有后进先出特点,我们可以用它来暂时保存数据,在画板开发中,我用到了栈来保存用户的每一步操作,当用户点击撤销时可以把图像从栈里面取出,然后恢复.浏览器的前进和后退也是这个原理,只是它保存的是网页罢了. ...

  10. 个人博客开发系列:Vue.js + Koa.js项目中使用JWT认证

    前言 JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519). 更多的介绍和说明,以及各种原理,我在此就不多赘诉了.JWT不是一个新鲜 ...