| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 581 人关注过本帖
标题:位移问题,有一段不明白!
只看楼主 加入收藏
古丁高手
Rank: 1
来 自:地狱
等 级:新手上路
帖 子:56
专家分:8
注 册:2012-8-8
结帖率:57.14%
收藏
 问题点数:0 回复次数:1 
位移问题,有一段不明白!
#include <stdio.h>
#include <stdlib.h>


void main()
{
    unsigned long input_IP;
    unsigned int BeginByte,MidByte,ThirdByte,EndByte;
    unsigned int_rotate=0x07;
                                             
    printf("******************************************************\n");
    printf("** This program is to show how to parse a IP address**\n");
    printf("******************************************************\n");                                             
    printf("Please enter the IP address(hex) you want parse:");
    scanf("%lx",&input_IP);
    BeginByte   = (input_IP >> 24) & ~(~0 << 8);
    MidByte = (input_IP >> 16) & ~(~0 << 8);
    ThirdByte  = (input_IP >> 8 ) & ~(~0 << 8);
    EndByte   = input_IP         & ~(~0 << 8);
    printf("******************************************************\n");
    printf("The IP address after parsed is: %d.%d.%d.%d\n",BeginByte,MidByte,ThirdByte,EndByte);
    /*介绍两个循环移位函数*/     
    printf("******************************************************\n");
    printf("%u after rotated twice is =%u\n",int_rotate,_rotl(int_rotate,2));
    printf("%u after rotated once is =%u\n",int_rotate,_rotr(int_rotate,1));
    scanf("%d",int_rotate);

}
  

    BeginByte   = (input_IP >> 24) & ~(~0 << 8);
    MidByte = (input_IP >> 16) & ~(~0 << 8);
    ThirdByte  = (input_IP >> 8 ) & ~(~0 << 8);
    EndByte   = input_IP         & ~(~0 << 8);
这一段不明白
搜索更多相关主题的帖子: long void address include 
2013-03-17 00:54
shmilyflf
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:356
专家分:1008
注 册:2012-12-9
收藏
得分:0 
BeginByte   = (input_IP >> 24) & ~(~0 << 8);
MidByte = (input_IP >> 16) & ~(~0 << 8);
ThirdByte  = (input_IP >> 8 ) & ~(~0 << 8);
EndByte   = input_IP         & ~(~0 << 8);
IP地址实际上是32位二进制数,为了便于记忆就分为四段,每段八位,中间用小数点隔开。每段八位的二进制数转成十进制,大小为0至255。这种格式称为点分十进制。
255.255.255.255类似这种,从左向右依次为第一字节、第二字节、第三字节、第四字节。
后面的~(~0 << 8)就相当于0xff也就是二进制的1111,1111。让input_IP右移24位,就是把input_IP的高8位放到低8位上,然后拿来和1111,1111与,其实还是那8位本身。
这样与完之后就可以得到BeginByte了,也就是IP的第一字节。后面三个和这个类似,input_IP >> 16得IP的第一和第二字节,但是与0000,0000,1111,1111后第一字节的全部为零了,所以只能得到第二个字节的值,ThirdByte和EndByte都是这个原理。
左移右移是按二进制位移动的,这个概念要是理解了,这个就应该不难。
它这四个变量每个保存的只是0-255(8位二进制数)的一个值,即IP的一个字节。
~是取反,~1=0,~0=1。>>是右移,8(1000)>>2得到2(10)。<<是左移,1<<8得到10000,0000。


[ 本帖最后由 shmilyflf 于 2013-3-17 01:33 编辑 ]
2013-03-17 01:29
快速回复:位移问题,有一段不明白!
数据加载中...
 
   



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

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