反转一个值中的最后n位

  这是在《使用位运算显示二进制数》的基础上进一步扩展,实现反转一个值中最后n位,参数为n和要反转的值。

  ~可以一个字节中所有的位,而不是选定的少数位。为达到指定要求,需创建一个掩码,该掩码最后n位设为1,其余的位设为0。然后,对该掩码和一个值使用^运算就可以转置这个值得最后n位,同时保留该值的其他位不变。

  

 1 //使用位操作符来显示二进制并翻转该值的最后n位
 2 #include<stdio.h>
 3 char *itobs( int, char*);                //integer to binary string
 4 void show_bstr( const char*);
 5 int invert_end(int, int);                 //关键算法
 6 main()
 7 {
 8     char bin_str[8 * sizeof(int) +1];
 9     int number;
10     int n;
11     while(scanf("%d", &number)==1)
12     {
13         itobs( number, bin_str);
14         printf("%d is \n", number);
15         show_bstr( bin_str);
16         putchar(‘\n‘);
17         puts("Enter an integer you want to invert:");
18         scanf("%d", &n);
19         number=invert_end(number, n);
20         printf("%Inverting the last %d bits gives\n", n);
21         show_bstr(itobs(number, bin_str));
22         putchar(‘\n‘);
23     }
24 }
25 char *itobs( int n, char *ps)
26 {
27     int i;
28     static int size = 8 * sizeof(int);
29     for( i=size-1; i>=0; i--, n>>=1)
30         ps[i]=(1&n)+‘0‘;                   //01&n就是n的最后一位的值(1&n也行),该值为0或1。字符数组需要字符‘0‘或‘1‘,加上‘0‘的ASCII编码可以完成转换
31     ps[size]=‘\0‘;
32     return ps;
33 }
34 //四位一组显示二进制字符串
35 void show_bstr(const char *str)
36 {
37     int i=0;
38     while(str[i])
39     {
40         putchar(str[i]);
41         if(++i%4==0  &&  str[i])
42             putchar(‘  ‘);
43     }
44 }
45 int invert_end(int num, int bits)
46 {
47     int mask = 0;
48     int bitval = 1;
49     while( bits-->0)
50     {
51         //mask|=bitval;
52         //bitval<<=1;
53         mask|=1;mask<<=1;         //若用注释语句,则需注释本句
54     }
55     mask>>=1;                        //若用注释语句,则需注释本句
56     return num^mask;
57 }
时间: 2024-12-16 07:08:06

反转一个值中的最后n位的相关文章

(C#) 反转字符串,反转一个句子中单词。

这个是非常基本的一道面试题,但是要考虑周全. 首先反转一个字符串: 基本思路是变成Char数组,然后调用C#里面的方法,或者设定两个index,从头,尾向中间遍历,并交换. 方法一: Array.Reverse(char *). 注意在开始的时候要判断字符串为null或空. public static string ReverseString(string input) { if (String.IsNullOrEmpty(input)) { return input; } char[] cha

得到一个数字中每一位的数字

学习编程也有一段时间了,随着学习的不断深入,我越来越体会到了算法的重要性,最近遇到了一些非常有意思的算法,比如打印水仙花数.将数字逆置,在这两个算法中会用到一个数字钟每一位的值 如:判断数字123是否是水仙花数需要得到每一位的数字 通常计算每一位的数字的算法是: 个位:a = 123 % 10 = 3 十位:b  = 123 %100 / 10 = 2 百位::c = 123 % 100 = 2 随着位数的越来越大,这种方法满足不了程序的需求 比如计算:123445677777777777777

在32位PE文件中的任意一个节中添加代码

// SectionOp.cpp : 定义控制台应用程序的入口点. // /************************************************ *程序说明:在32位PE文件中的任意一个节中添加代码 *          第一个参数为PE文件 第二个参数为第N个节 * * 时间: 20170718 * Win10 VS2010 测试通过  ver 0.01 **************************************************/ #inc

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简

算法题:找出一个数组中相加值最大的连续序列元素

package arithmetic; /** * @author SHI * 求一个数组中相加值最大的连续序列元素 */ public class MaxSequence { public static void main(String[] args) { int[] a=new int[]{-2,9,-3,4,-6,7,-6,4}; findBigSequence(a); } /** * 思想: (1)计算出该数组的所有元素和,假设该值为最大 * (2)从数组下标1到a.length-1依次

sql server 获取每一个类别中值最大的一条数据

sql server 获取每一个类别中值最大的一条数据 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 /* 数据如下: name val memo a    2   a2(a的第二个值) a    1   a1--a的第一个值 a    3   a3:a的第三个值 b    1   b1--b的第一个

在map中一个key中存多个值

一说到map都想到key-value键值队存在.key可以为最多一个null的key. 今天开发中一个业务需求,在map中一个key中存多个对象. 我首先想到Map<String,List>造型来解决.尤其是那种一对多的可以这么设计. Map<String,List> map = new HashMap<String,List>();//模型就是这么个. for(int i=0;i<listObj.size();i++){ key = listObj.getId(

把一个数组遍历倒序放到另一个数组中,数组取值是c:out value

1 var year = "<c:out value="${year}" />"; 2 3 var years = []; 4 5 var yearDataArray = []; 6 //遍历year,放进yearDataArray中 7 $("#year option[value!='']").each(function(){ 8 yearDataArray.push($(this).text()); 9 }); 10 //year

JAVA获取oracle中sequences的最后一个值

项目中,用到一个序列作单号,框架用的是ssh,在dao层去拿的时候,运行时报错为dual is not mapped,[select *.nextval nextvalue from dual] 后来检查发现,获取方式不对,于是改成下面这样,就可以正常获取了 //获取seq的最后一个值 public String findSeq(){ try { String sql = "select PATIENT_SEQ.nextval nextvalue from dual"; Integer