| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 426 人关注过本帖
标题:问一个小白的问题,c中的位移,不是很懂,求教一下。。。。。
只看楼主 加入收藏
冬冬123
Rank: 2
等 级:论坛游民
帖 子:80
专家分:67
注 册:2013-3-3
结帖率:80%
收藏
已结贴  问题点数:20 回复次数:6 
问一个小白的问题,c中的位移,不是很懂,求教一下。。。。。
左位移:<<
格式:x<<要位移的位数
功能:把操作对象的二进制数向左移动指定的位,并在右边补上相应的0,高位溢出。
示例:x=01010011,y=x<<2,则y=10110000
注意:左移会引起数据的变化,左移以为相当于对原来的数值乘以2.


就是示例中看不懂,x左移两位不是应该等于01001100吗,怎么会变成10110000呢,还请论坛的神们帮忙理解下,谢谢
2014-01-07 17:31
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:7 
自己写个代码验证下就好了,如果怀疑不对的话

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2014-01-07 22:39
stop1204
Rank: 9Rank: 9Rank: 9
来 自:福建省
等 级:贵宾
威 望:22
帖 子:295
专家分:1151
注 册:2013-9-8
收藏
得分:7 
好吧.  比如    十进制整数 2    二进制就是   00000010
那么  假设它是 x  
x << 2
就是左移2位.那么就是把二进制数据整体向左移动2个位,右边出现新的字符将以0代替
    00|000010|00, 其实结果就是这样.  但是呢.超出二进制8个位,又由于二进制是右往左计算起的.
那么,将左边多出的2个位省略,即 00001000
那么 00001000 即 十进制整数 8
[左移一个位即 乘以1个 2 ,即 2的1次方 (2^1)]   左移两个位即 乘以2个2,即 2的2次方(2^2)

x << 2    x * 2 * 2 即 x * 2^2 即 2 × 2 × 2 = 8

而右移呢  即 向右移动 , 即  ÷ 2
x >> 2
  00|000000|10     左边新增 2个0数字位 , 右边多出两个将省略 .. 即  00000000



下面是我以前学C的题目: 将 y 中的某几个位替换到 x 中 , 二进制形式
程序代码:
#include "stdio.h"
main()
{
// 下面是两种题目
    unsigned x = 91;        // 01011011 二进制
    int p=5,n=2,y=32;    // result 107
    printf("%d\n", x & ~(~(~0<<n) << (p+1-n)));    //把x第p位开始往右n个字符清0,其余不变
    printf("%d\n", y & ~(~0<<n) << (p+1-n));    //把y中除最右边的n位意外的其他位都清零,并左移到第p位处
//--------------------------------- ~为取反,二进制位的0全变为1,1全变为0----------------------------------------------
    printf("%d\n", ~0<<n );                //把一个所有位都为1的屏蔽码左移n位(右边将多出n个0位)
    printf("%d\n", ~(~0<<n) );            //把屏蔽码n位全设置为1,其余位0
    printf("%d\n", ~(~0<<n) << (p+1-n) );        //把屏蔽码为1的位左移到p处
    printf("%d\n", ~(~(~0<<n) << (p+1-n)));        //把屏蔽码的n位全设置为0,其余位全为1
    printf("%d\n", x & ~(~0<<n) << (p+1-n) );    //将x的第p位往右数n位的字段清0
    printf("%d\n", x & ~(~(~0<<n) << (p+1-n))  |    (y & ~(~0<<n) << (p+1-n)));
}

hl928452957@gmail点com

2014-01-08 08:58
stop1204
Rank: 9Rank: 9Rank: 9
来 自:福建省
等 级:贵宾
威 望:22
帖 子:295
专家分:1151
注 册:2013-9-8
收藏
得分:0 
我估计你那题目 打错了, ,很正常,. 很多教材都有错误的地方

hl928452957@gmail点com

2014-01-08 09:00
so_love
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:7
帖 子:812
专家分:4151
注 册:2013-11-25
收藏
得分:7 
其实这个完全你可以自己去验证。

一花一世界、一叶一追寻、片片花叶落、情系何人身。
2014-01-08 09:36
冬冬123
Rank: 2
等 级:论坛游民
帖 子:80
专家分:67
注 册:2013-3-3
收藏
得分:0 
谢谢各位友们的帮助,因为才学习到这里,所以不懂,现在确认应该是书上错了。。。。。

天下寒士俱欢言!!!
2014-01-14 10:59
冬冬123
Rank: 2
等 级:论坛游民
帖 子:80
专家分:67
注 册:2013-3-3
收藏
得分:0 
回复 4 楼 stop1204
谢谢你lz

天下寒士俱欢言!!!
2014-10-29 16:35
快速回复:问一个小白的问题,c中的位移,不是很懂,求教一下。。。。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016007 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved