精华内容
下载资源
问答
  • 二进制向右移动一位
    2020-06-29 22:17:13

    二进制移动

    1、算术左移-逻辑左移

    算​术左移和逻辑左移一样都是右边补0:
     比如: 00101011​ 算术左移一位:01010110 
                    逻辑左移一位​:01010110
    

    对于二进制的数值来说左移n位等于原来的数值乘以2的n次方

     比如:00011010十进制是26,左移两位后是011010​00转成十进制是104恰好是26的4倍。
    

    ps:这种倍数关系只适用于左移后被舍弃的高位不含1的情况,否则会溢出。

    ​2、 算术右移,逻辑右移

    逻辑右移很简单,只要将二进制数整体右移,左边补0即可
     比如:10101101逻辑右移一位为01010110
    
    算术右移符号位要一起移动,并且在左边补上符号位,也就是如果符号位是1就补1符号位是0就补0
     比如:11100算术右移一位为11110(符号位1跟着一起移动并且左边补了1)  
    

    对于二进制的数值来说右移n位等于原来的数值除以2的n次方

    比如10110100十进制是76(需要先将这个补码转换成原码之后再转换成十进制),右移两位后是11101101转成十进制是19恰好是76的4倍。  
    

    3、算数移动逻辑移动的意义

    算术左移和算术右移主要用来进行有符号数的倍增、减半;  
    逻辑左移和逻辑右移主要用来进行无符号数的倍增、减半。
    
    更多相关内容
  • 二进制的左右移位运算

    万次阅读 2017-01-16 20:35:51
    移位运算符:最重要的一点,虽然数字存贮在计算机内存...→移位运算符:符号随着运算数的移动,当为正数的时候最高补0,为负数的时候符号补1,最高的补位取决于编译器,较多的补1. int i = 1; i = i 也就

    移位运算符:最重要的一点,虽然数字存贮在计算机内存中是以2进制的补码形式,但是运用移位运算符时是对源码进行的。

    ←移位运算符:高位舍弃,低位补0(负数与正数的运算是一样的)

    例:int a=-10,g.   g=a<<4=-160  a:11010(2)→110100000=-160(10)

    →移位运算符:符号位随着运算数的移动,当为正数的时候最高位补0,为负数的时候符号位补1,最高位的补位取决于编译器,较多的补1.

    int i = 1;
    i = i << 2; //把i里的值左移2位
    也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成000... 0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了( 有符号数不完全适用,因为左移有可能导致符号变化,下面解释原因)


    需要注意的一个问题是int类型最左端的符号位和移位移出去的情况.我们知道,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出,例如:
    int i = 0x40000000; //16进制的40000000,为2进制的01000000...0000
    i = i << 1;
    那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000...0000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是-2147483648,溢出.如果再接着把i左移1位会出现什么情况呢?在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0.


    左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时, 编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如:
    int i = 1, j = 0x80000000; //设int为32位
    i = i << 33; // 33 % 32 = 1 左移1位,i变成2
    j = j << 33; // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃
    在用 gcc编译这段程序的时候 编译器会给出一个warning,说左移位数>=类型长度.那么实际上i,j移动的就是1位,也就是33%32后的余数.在gcc下是这个规则,别的编译器是不是都一样现在还不清楚.
    总之左移就是: 丢弃最高位,0补最低位
    再说右移,明白了左移的道理,那么右移就比较好理解了.
    右移的概念和左移相反,就是往右边挪动若干位,运算符是>>.
    右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:
    int i = 0x80000000;
    i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000
    就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.
    负数10100110 >>5(假设 字长为8位),则得到的是 11111101
    总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.
    在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了 位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。
    (引用部分内容)。


    
    展开全文
  • 问题标题c语言中如何提取二进制数中的某一位...-,C编程中如何提取二进制中的某一位或者连续几位-网友答案下面是三种方式: ①通过模2除2(%2、/2)的方法 num%2——取出二进制的最后一位 num/2——右移去掉二进制的最...

    问题标题

    c语言中如何提取二进制数中的某一位?,C编程中如何提取二进制中的某一位或者连续几位

    2019-4-4来自ip:12.124.150.84的网友咨询

    浏览量:868 手机版

    问题补充:

    c语言中如何提取二进制数中的某一位?-,C编程中如何提取二进制中的某一位或者连续几位-

    网友答案

    下面是三种方式: ①通过模2除2(%2、/2)的方法 num%2——取出二进制的最后一位 num/2——右移去掉二进制的最后一位 通过while循环,依次取出二进制的最后一位数字判断是否为1,若为1则count++,while(num)只有当num变为0时循环结束。

    问题:在测试-1出现bug,-1的二进制中应该有32个1,输出却为0。

    我们将-1带入代码中发现-1%2=0,count不增,然后-1/2=0,循环结束,故输出count的值为0。

    解决方案:将变量num的数据类型改为unsigned int 无符号整型,此时表示的是正的整型的最大值,所以当num=-1时,表示二进制为32个1的正数,通过循环可以输出正确的个数。

    ②通过右移操作符>>、按位与操作符&实现 Example:当num=10(1010),通过右移操作num>>i,二进制向右移动i位。

    //i=0,num>>0,右移0位,此时1010&(0001)=0 //i=1,num>>1,右移1位,此时0101&(0001)=1,count++ //i=2,num>>2,右移2位,此时0010&(0001)=0 //i=3,num>>3,右移3位,此时0001&(0001)=1,count++ …… 因为二进制共32位,所以循环要执行32次后结束,得到count为2。

    缺点:不够高效,必须循环32次。

    ③通过按位与操作符&巧妙运算实现 Example: 当num=15时, 1//num&(num-1)=(1111)&(1110)=(1110) 2//num&(num-1)=(1110)&(1101)=(1100) 3//num&(num-1)=(1100)&(1011)=(1000) 4//num&(num-1)=(1000)&(0111)=0 ,循环停止。

    共执行4次while循环。

    扩展资料 一、指定的某一位数置1 宏 #define setbit(x,y) x|=(1> (y)&1) ...

    网友答案

    “C语言里怎样提取一个十六进制数的最高位?”具体解决方案如下:解决方案1:你是不是想这样/对于0x30,3是最高位,0是最低位?如果是的话那就这样办:首先不同类型处理方法不同,int型是2字节,伱可以这样最高为提取,int a=b&0xf09(b为提取对象),最地位int a=b&0x0f(b为提取对象),long型是4字节伱可以这样,long a=b&0xf000,long a=b&0x000f;还有什么再问那稍加修改:int a=b&1000000000000000b,int a=b&0000000000000001b,long a=b&10000000000000000000000000000000b,int a=b&00000000000000000000000000000001b;这是2进制数的位操作,虽然看起来麻烦,但是效率最高,其他还有方法,但是在单片机中不推荐如果你学过汇编这点很好理解,没学过也没事,我现在说给你听,这里提取取位用到的是c语言种的为操作,&amp;与操作的定义是:1&1=1,1&amp;0=0,0&1=0,0&0=0,|或操作的定义是:1|1=1,1|0=1,0|1=1,0|0=0,所以要提取二进制中的某一位,思想是保留那一位,其余为全为0,这样就&amp;操作符就可以轻松做到,比如0011&0001=0001,提取最低位,0011&amp;1000=1000,提取最高位,还有就是在c语言里int型是2字节,long型是4字节解决方案2:的意思应该a=0x30;b=a>>7;得到的b是0x30的最高位

    网友答案

    如果只有一位是1的话,很好做啊,这个变量a只可能是1或2或4或8或16或32或64或128,这样的话程序就好写了,可以用for语句,我下边写个最简单的:if (a==1)i=0;else if (a==2)i=1;else if (a==4)i=2;else if (a==8)i=3;........printf"第%d位是1 \n",i;

    网友答案

    0变1其它位不变,位或一个该位为1其它位为0的数可得1变0其它位不变,位与一个该位为0其它位为1的数可得得到等N位为1其它位为0的数,可用1左移N位即得得到等N位为0其它位为1的数,用前数位反一下即得演示程序:#includechar*int2bin(int ,char* );int main(){int x0,x1,n,flag;char x0b33={0};char x1b33={0};while(1){x0 = x1 = n = flag = -1;printf"输入原始数值 操作位0-31 和操作方式1置/0清\n");scanf("%d %d %d", &x0, &n, &flag);if( n31 || flag!=0&&flag!=1 ) break;//无效输入将退出if(flag==1)//置1{x1 = x0 | (1}else//清0{x1 = x0 & ~(1}printf"处理前十进制:%-10d 二进制:%s\n", x0,int2bin(x0,x0b));printf"处理后十进制:%-10d 二进制:%s\n\n",x1,int2bin(x1,x1b));fflush(stdin);}return 0;}char*int2bin(int x,char*out){for(int i=0;iouti = (x&(1out32 = '\0';return out;}

    网友答案

    伱是不是想这样/对于0x30,3是最高位,0是最低位?如果是的话那就这样办:首先不同类型处理方法不同,int型是2字节,伱可以这样最高为提取,int a=b&0xf09(b为提取对象),最地位int a=b&0x0f(b为提取对象),long型是4字节伱可以这样,long a=b&0xf000,long a=b&0x000f;还有什么再问那稍加修改:int a=b&1000000000000000b,int a=b&0000000000000001b,long a=b&10000000000000000000000000000000b,int a=b&00000000000000000000000000000001b;这是2进制数的位操作,虽然看起来麻烦,但是效率最高,其他还有方法,但是在单片机中不推荐

    网友答案

    这个函数可以计数x中1的个数:int count_bit1(unsigned int x){ int n=0;do { n += x &1; x>>=1; } while (x!=0);return (n);}请注意这里x必须定义为unsigned型,如果写成有符号型,则当x是负数时>>运算因符号扩展永远不完。

    网友答案

    “C语言里怎样提取一个十六进制数的最高位?”具体解决方案如下:解决方案1:你是不是想这样/对于0x30,3是最高位,0是最低位?如果是的话那就这样办:首先不同类型处理方法不同,int型是2字节,伱可以这样最高为提取,int a=b&0xf09(b为提取对象),最地位int a=b&0x0f(b为提取对象),long型是4字节伱可以这样,long a=b&0xf000,long a=b&0x000f;还有什么再问那稍加修改:int a=b&1000000000000000b,int a=b&0000000000000001b,long a=b&10000000000000000000000000000000b,int a=b&00000000000000000000000000000001b;这是2进制数的位操作,虽然看起来麻烦,但是效率最高,其他还有方法,但是在单片机中不推荐如果你学过汇编这点很好理解,没学过也没事,我现在说给你听,这里提取取位用到的是c语言种的为操作,&与操作的定义是:1&1=1,1&0=0,0&1=0,0&0=0,|或操作的定义是:1|1=1,1|0=1,0|1=1,0|0=0,所以要提取二进制中的某一位,思想是保留那一位,其余为全为0,这样就&操作符就可以轻松做到,比如0011&0001=0001,提取最低位,0011&1000=1000,提取最高位,还有就是在c语言里int型是2字节,long型是4字节解决方案2:的意思应该a=0x30;b=a>>7;得到的b是0x30的最高位...

    我来回答

    验证码:

    e9568dae565949379ec40a9dfa476c45.gif

    大家还关注

    展开全文
  • 获取二进制数中某一位的值

    万次阅读 2018-05-30 11:09:24
    获取数字 num 二进制形式第 bit 的值。注意: 1、bit 从 1 开始 2、返回 0 或 1 3、举例:2 的二进制为 10,第 1 为 0,第 2 为 1 示例1 输入 复制 128, 8 输出 复制 1 我的解答: function ...

    题目描述

    获取数字 num 二进制形式第 bit 位的值。注意:
    1、bit 从 1 开始
    2、返回 0 或 1
    3、举例:2 的二进制为 10,第 1 位为 0,第 2 位为 1

    示例1

    输入

    复制

    128, 8

    输出

    复制

    1

    我的解答:

    function valueAtBit(num, bit) {
        var str=num.toString(2);
        return str[str.length-bit];

     }

    利用toString()函数,将数字转化为了二进制字符串,然后字符串长度和位的关系将其取出

    其他解答:

     

    function valueAtBit(num, bit) {

        return (num >> (bit -1)) & 1;

    }

    利用了移位操作,之前没有接触过这种解法,理解之后感觉相当简洁

    以上面的示例分析,128,8-》1;

    128->1000 0000;要想将第八位上的数字取出,可以将她移到第一位上,也即是向右移动7位变成0000 0001,怎样将第一位上的1拿出来呢,可以利用与操作,让0000 0001,与1(0000 0001)与,除了第一位上的数是它本身,其余位全部变成了0,这样就将第一位取了出来。

    自己可以写个二进制数字分析下,如:1000 0000 第八位是1,要想将他移到第一位上,移动的就是bit-1位,之后让它和1与,这样就能将除了第一位之外的其他位上的数字置0,输出的就只有第一位上的数字,也即是我们需要的那个

     

    展开全文
  • 二进制运算

    2019-02-17 11:50:13
    顾名思义,就是将二进制位的每一位取反 例: 000101100 ~000101100 =111010011 但是在上机运行的时候,System.out.println(~5) 输出位-6 我们来分析分析: Java使用补码来表示二进制,在补码表示中,最高为为0表示...
  • 二进制位运算 左移与右移

    千次阅读 2019-08-03 20:11:59
    原码:个整数按照绝对值的大小转化成二进制的数 反码:将二进制数按取反 补码:反码加 1 以-14 举例 原码:14 即 00000000 00000000 00000000 00001110 反码: 11111111 11111111 11111111 11110001 补码...
  • 二进制位运算

    万次阅读 多人点赞 2017-12-03 20:00:01
    运算基础 运算(包括与,或,取反,异或,左移,右移等)是程序设计中的个重要的领域。尤其是安全和底层开发中,除了指针的频繁使用之外,运算是另个非常频繁使用的领域。 因此,在求职面试中,...
  • 二进制位运算---左移右移

    千次阅读 2019-11-11 22:03:47
    二进制位运算---左移(<<)右移(>>) (1).二进制中负数的计算 负数以正数的补码表示 原码:个整数按照绝对值的大小转化成二进制的数 反码:将二进制数按取反 补码:反码加 1 以-14 举例 原码...
  • 二进制的左移和右移(方便理解)

    千次阅读 2022-07-06 05:18:15
    二进制左移几就是后面加几个0,前面去掉几,负数的左移,跟正整数左移一样,右边补0,一直左移的话,最后就是0啦。举例说明:2
  • 简单理解二进制的左移和右移(通俗易懂)

    万次阅读 多人点赞 2020-08-11 09:48:02
    左移(<<) 符号表示 : << 简单理解:二进制左移几位就是后面加几个0,前面去掉几位 举例说明: 39左移两位 ...简单理解:和左移同理...左移一位相当于乘2,右移一位相当于除2(不完全等同),比除法快 ...
  • 二进制图文详解

    2017-09-11 14:18:47
    如果看做小数点不动,数字向右移动一次,原始数据除以10 ... 2进制数有同样现象:数字向右移动一次,原数据除以2 n = 00000000 00000000 00000000 01010000 m = n>>3; m = 00000000000 00000000 00000000 ...
  • 二进制原码 反码 补码、二进制位运算、二进制移位运算
  • 运算及如何将个十进制数转化为二进制
  • 二进制计算

    千次阅读 2021-07-21 05:31:49
    虽然很早就接触了二进制,却一直没有正视这个问题,阅读《计算机科学导论》的时候,基本上是跳过了这部分,总是以“这么基础的东西,反正工作中基本用不上”的理由给搪塞过去。最近正在阅读《编码》和《程序员的...
  • 二进制位运算符

    2021-10-08 11:21:45
    二进制否运算符(not):符号为~,表示对二进制位取反。 异或运算符(xor):符号为^,表示若两个二进制位不相同,则结果为1,否则为0。 左移运算符(left shift):符号为<<,详见下文解释。 移运...
  • 截止目前我们已经学习了MySQL的三种...先看看运算符的定义:运算符用来对二进制字节中的进行位移或者测试处理,MySQL中提供的运算符有按或(|)、按与(&)、按异或(^)、按左移(<>)、按取...
  • 将一个整数的二进制的奇数位和偶数位交换 #define _CRT_SECURE_NO_WARNINGS 1 // 1. 取出奇数或者偶数 按位与 0101010类似的数据 //...之后的数据 移动一位 就得到了偶数位 // (num&am...
  • 键盘输入个整数(int),将整数在内存中的存放形式(32位二进制)循环右移n
  • 二进制否运算符(not):符号为~,表示对二进制位取反。 异或运算符(xor):符号为^,表示若两个二进制位不相同,则结果为1,否则为0。 左移运算符(left shift):符号为<<,详见下文解释。 移运算符...
  • 二进制运算符

    千次阅读 2021-07-29 01:09:56
    概述作用速度块都作用于32整数二进制位运算符用于直接对二进制位进行计算...二进制否运算符(not):符号为~,表示对二进制位取反。异或运算符(xor):符号为^,表示若两个二进制位不相同,则结果为1,否则为0。...
  • 但其实123表示的1(10^2) + 2(10^1) + 3*(100),(102表示10的次方),它表示的是各个位置数字含义之和,每个位置的数字含义与位置有关,从右向左,第一位乘以10的0次方,即1,第位乘以10的1次方...
  • 本文将介绍二进制和数据存储的相关概念(包括、字节、高低、大小端、原码、反码、补码、进制转换),以及二进制运算。注意:本文讲解偏实战,有些定义不够严谨,如需深入研究可以进一步阅读二进制的原码、反码...
  • 判断个数的二进制数有多少1

    千次阅读 2020-04-01 15:20:38
    其实这篇文章可以挖的很深,从二进制的本质出发有很多可以考虑的点。但是我并不能理解这么深55555 从题目中的问题出发,我们将十进制转换为二进制的时候使用的是什么方法呢? 将该数跟2取余,再除于2,反复操作,...
  • C语言 某数输出二进制的某

    千次阅读 2021-05-20 12:51:48
    如题:输入个整数,截取它对应的二进制位中从到左的第8-11(最右边为第0)。**输入格式要求:"%d" 提示信息:"请输入个整数:"**输出格式要求:"它的从开始的第11-8为:\n" "%d "程序运行示例如下:请输入...
  • 二进制中为1的位数

    2020-12-15 13:39:56
    二进制中为1的位数题目要求给定一个整数,请计算二进制中为1的位数输入: 13输出: 3解释: 13的二进制表示是 1101,位为1的数量是3思路分析如果一个数是奇数,那么它的二进制的最后一位一定是1,道理很简单,其他的位...
  • 二进制右移问题

    2020-01-08 21:27:05
    000…(31个0)1 这个二进制数右移24位变成 0000…(23个0)1(8个0),因为这个数右移一位变成1000…(31个0),最右边的1变到最左边。 还有注意一个问题:CPU可以直接控制自己的内存器,但是对于引脚等外部寄存器...
  • 题目: 题目思路: 首先我们知道a数组中所有值的和为m 我们要求a数组中所有值异或的值最大的情况数 我们要先抓住题目的第个条件 (使a数组中所有值的异或的值为最大) ...a2={3,1} (二进制为{01
  • 二进制运算

    千次阅读 2019-03-15 20:03:26
    所有编程语言都是种人和计算机之间的翻译工具,人的数组语言翻译成二进制给计算机读取,然后把计算机的二进制数据翻译成人类的语言呈现出来。 16进制 16进制用于缩写(简写)2进制,将2进制从后向前 每4位数转换...
  • 二进制位到提取每个二进制位到C++中bitset使用 ...右移是算术移位,即:按二进制形式把所有数字向右移动相应的位数,低位移出(舍弃),正数,高位的空位补0。负数,高位的空位补1.。 对有符号整型和

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 69,109
精华内容 27,643
关键字:

二进制向右移动一位