《C程序设计语言》 练习2-6 及 位运算总结
问题描述
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 及 位运算总结的更多相关文章
- 全国计算机等级考试二级教程-C语言程序设计_第15章_位运算
位运算,不适用于实数,仅仅适用于整数.字符. C语言的位运算只能操作整数.字符,实数是指数方式表示的,不适用于位运算. #define _CRT_SECURE_NO_WARNINGS #include ...
- C语言的移位操作符及位运算
C语言的移位操作符 位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算.位移位运算符分为左移和右移两种,均为双目运算符.第一运算对象是移位对象,第二个运算对象是所移的二进制位数. 位 ...
- 操作系统和程序设计语言的API使用的字符编码分析
1.Java的运行环境中,String是什么编码? 使用java做程序设计语言,字符编码是和jvm相关的,和操作系统无关. java默认的编码是jvm在安装的时候就确定了的,它是根据你的系统的环境确 ...
- 清风注解-Swift程序设计语言:Point6~10
目录索引 清风注解-Swift程序设计语言 Point 6. 输出常量和变量 代码事例: // 输出的内容会在最后换行 println("hello, world") // 输出的 ...
- awk程序设计语言之-awk基础
awk程序设计语言之-awk基础 http://man.linuxde.net/ 常用工具命令之awk命令 awk是一种编程语言,用于在Linux/Unix下对文本和数据处理.数据可以来自标准输入(s ...
- 《C程序设计语言》【PDF】下载链接:
<C程序设计语言>[PDF]下载 https://u253469.pipipan.com/fs/253469-230382180 内容简介 在计算机发展的历史上,没有哪一种程序设计语言像C ...
- C程序设计语言笔记-第一章
The C Programming language notes 一 基础变量类型.运算符和判断循环 char 字符型 character ...
- c++学习书籍推荐《C++程序设计语言(特别版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 <C++程序设计语言(特别版•十周年中文纪念版)>编辑推荐:十周年纪念版,体味C++语言的精妙与魅力,享受与大师的心灵对话.1979年,Biarn ...
- C语言学习书籍推荐《C程序设计语言(第2版•新版)》下载
克尼汉 (作者), 等 (作者, 译者), 徐宝文 (译者) 下载地址:点我 <C程序设计语言(第2版•新版)>是由C语言的设计者Brian W.Kernighan和Dennis M.Ri ...
随机推荐
- 常用App用户体验找茬
冯晓云: 哔哩哔哩手机客户端:视频播放只允许横屏全屏:还有长视频的“5分钟诅咒”,遇到网速不好的时候是个大写的悲剧: 必应词典UWP版本:主页新闻链接跳转后,一些页面不支持划词取译,当然本身各个页面也 ...
- A. Number Theory Problem
题目大意:计算小于2^n,且满足2^k-1并且是7的倍数的个数 思路:优先打表,数据不大,1e5,然后求个前n项和 #include<bits/stdc++.h> using namesp ...
- 【论文研读】强化学习入门之DQN
最近在学习斯坦福2017年秋季学期的<强化学习>课程,感兴趣的同学可以follow一下,Sergey大神的,有英文字幕,语速有点快,适合有一些基础的入门生. 今天主要总结上午看的有关DQN ...
- echarts使用笔记
1.解决列文字隔开问题,及文字太长问题解决. yAxis: [ { type : 'category', data : message.data[0].dataone, axisLabel: { in ...
- Java中常用的七个阻塞队列第二篇DelayQueue源码介绍
Java中常用的七个阻塞队列第二篇DelayQueue源码介绍 通过前面两篇文章,我们对队列有了了解及已经认识了常用阻塞队列中的三个了.本篇我们继续介绍剩下的几个队列. 本文主要内容:通过源码学习De ...
- 1. git 本地给远程仓库创建分支 三步法
命令如下: 1:本地创建分支dev 1 2 Peg@PEG-PC /D/home/myself/Symfony (master) $ git branch dev 2:下面是把本地分支提交到远程仓库 ...
- 吃瓜的正确姿势,Python绘制罗志祥词云图
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 这篇文章中向大家介绍了Python绘制词云的方法,不难看出绘制词云可以说是一 ...
- MergeSort归并排序和利用归并排序计算出数组中的逆序对
首先先上LeetCode今天的每日一题(面试题51. 数组中的逆序对): 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. ...
- 大数据作业之利用MapRedeuce实现简单的数据操作
Map/Reduce编程作业 现有student.txt和student_score.txt.将两个文件上传到hdfs上.使用Map/Reduce框架完成下面的题目 student.txt 20160 ...
- 使用ExecutorService来停止线程服务
文章目录 使用shutdown 使用shutdownNow 使用ExecutorService来停止线程服务 之前的文章中我们提到了ExecutorService可以使用shutdown和shutdo ...