首页 > 其他分享 >二进制位交换,反转,与统计1的个数

二进制位交换,反转,与统计1的个数

时间:2023-05-31 19:03:35浏览次数:37  
标签:ch 二进制 二进制位 反转 个数 unsigned char int ans


问题一:给一个整数v,求它的二进制表示中从右往左数第x位和第y位交换后的值(从0开始计数)。

 

分析:举个例子,如果v的二进制表示为XXXXaXXXXXXbX,我们交换第1位和第8位。我们是这样做的:

先把这两位的值都取零后的值保存在一个变量里面,即tmp = XXXX0XXXXXX0X,然后再取ans = 0000b000000a0,那么可

以看出tmp | ans就是答案了。现在关键是求ans,ans可以成是这样,ans = (((v>>y)&1)<<x) | (((v>>x)&1)<<y)。

 

那么很容易写出代码:

unsigned int _swap(int v,int x,int y)
{
    return v & (~(1 << x)) & (~(1 << y)) | (((v >> y) & 1) << x) | (((v >> x) & 1) << y);
}

 

问题二:给一个十进制整数v,求它的二进制表示反转后对应的十进制数。

unsigned int Bit_Reverse(unsigned int v)
{
    v = ((v >> 1) & 0x55555555) | ((v << 1) & 0xaaaaaaaa);
    v = ((v >> 2) & 0x33333333) | ((v << 2) & 0xcccccccc);
    v = ((v >> 4) & 0x0f0f0f0f) | ((v << 4) & 0xf0f0f0f0);
    v = ((v >> 8) & 0x00ff00ff) | ((v << 8) & 0xff00ff00);
    v = ((v >> 16) & 0x0000ffff) | ((v << 16) & 0xffff0000);
    return v;
}

 

对char型数据处理:

unsigned char Bit_Reverse(unsigned char ch)
{
    ch = (ch &0x55) <<1| (ch >>1) &0x55;
    ch = (ch &0x33) <<2| (ch >>2) &0x33;
    ch = (ch &0x0F) <<4| (ch >>4) &0x0F;
    return ch;
}

 

问题三:给定一个数x,求它的二进制表示中有多少个1。

int cnt(unsigned int x)
{
    x = x - ((x>>1)&0x55555555);
    x = (x & 0x33333333) + ((x>>2)&0x33333333);
    x = (x + (x>>4)) & 0x0f0f0f0f;
    x = (x + (x>>8));
    x = (x + (x>>16));
    return x&0x3f;
}

 

标签:ch,二进制,二进制位,反转,个数,unsigned,char,int,ans
From: https://blog.51cto.com/u_16146153/6388993

相关文章

  • HDU3662(求三维凸包表面的多边形个数,表面三角形个数,体积,表面积,凸包重心,凸包中点到面
    题目:3DConvexHull题意:给定空间中的n个点,求这n个点形成的凸包的表面的多边形个数。增量法求解:首先任选4个点形成的一个四面体,然后每次新加一个点,分两种情况:1>在凸包内,则可以跳过2>在凸包外,找到从这个点可以"看见"的面S(看不看得见可以用法向量,看点是否在面外侧),删除这些......
  • PTA 组最小个数
       importjava.util.ArrayList;importjava.util.Arrays;importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){ArrayList<Integer>list=newArrayList<>();Scannerinput=newScanner(Syste......
  • NJUST1712(形成三角形面积为整数的个数)
    题目:1712-Triangles 题意:给定三角形的三点,分别是A,B,C,它们的横纵坐标都属于整数,然后给定两个数n和m。要求满足:, 和这3个条件的三角形个数,并且对1000000007取余。 分析:由于用的是坐标,那么我们很容易想到用叉积来表示面积,那么就得到:   然后就可以很明显知道:与一奇一偶。 然......
  • 代码随想录算法训练营第16天 | ● 104.二叉树的最大深度 559.n叉树的最大深度 ● 111
     第六章二叉树part03 今日内容:  ●  104.二叉树的最大深度  559.n叉树的最大深度●  111.二叉树的最小深度●  222.完全二叉树的节点个数 迭代法,大家可以直接过,二刷有精力的时候 再去掌握迭代法。  详细布置   104.二叉树的最大深度 (优先掌......
  • 代码随想录算法训练营第六天|哈希表理论基础、242.有效的字母异位词两个数组的交集、2
    242.有效的字母异位词力扣题目链接(opensnewwindow)给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。示例 1:输入:s="anagram",t="nagaram"输出:true示例2:输入:s="rat",t="car"输出:false说明: 你可以假设字符串只包含小写字母。思路:......
  • mysql快速对比两个数据库表名的差异
    2023年5月29日14:51:02因为正式库老是和测试库有差1-2张表,表也有100张了,排除差异有点麻烦SELECTtable_nameFROMinformation_schema.TABLESWHEREtable_schema='数据库名'这样就得到两个数据库表名列新建两个txt,database.txt和database_test.txt选中两个文件,右键使用T......
  • echarts堆叠柱状图上方展示两个数据项的总和
        //当月漏项统计排名getIndicatorCurve(data1){echarts.init(document.getElementById('lineOption5')).dispose()//销毁实例//找到容器letmyEcharts=echarts.init(document.getElementById('lineOption5'),......
  • 反转和随机排名
    packagecom.Demo;importjava.util.Random;importjava.util.Scanner;publicclasstEST1{publicstaticvoidmain(String[]args){//把数据拿到程序中来,用数组装起来int[]one={15,900,1000,20000,9500,-5};//定义一个变量用于最终记......
  • 多个变量指向同一个数组对象
    packagecom.karl1;publicclassArrayDemo4{publicstaticvoidmain(String[]args){//多个变量指向同一个数组对象的形式int[]arr1={11,22,33};//把int类型的数组变量arr1赋值给int类型的数组变量arr2int[]arr2=arr1;......
  • 1-10的数组,按指定的个数,依次取,计算每次取到的数组
    第一种方法,改变数组的方法<?php$kaochang=[1,2,3,4,5,6,7,8,9,10];$kaodian=[2,3,2,3];$temp=[];foreach($kaodianas$k=>$v){ $newkaochang=array_splice($kaochang,$v); $remove=array_diff($kaochang,$newkaochang); $kaochang=$newkaochang; $temp[$k]=$remo......