| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1456 人关注过本帖
标题:位运算的问题
只看楼主 加入收藏
lyj23
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:168
专家分:140
注 册:2010-10-31
结帖率:86.21%
收藏
 问题点数:0 回复次数:7 
位运算的问题
    位运算这么烦,它有什么用啊!现在计算机技术发达,内存空间不大可能不够用,‘<<’ 运算符 ‘>>’ 运算符只不过能算乘法、除法,还要转换成二进制算会不会溢出!
    高手来告诉我,位运算的好处是什么?C语言为什么要用低级语言的位运算?
搜索更多相关主题的帖子: 计算机 二进制 C语言 空间 
2011-02-20 19:58
洛云
Rank: 5Rank: 5
等 级:职业侠客
帖 子:204
专家分:356
注 册:2010-2-3
收藏
得分:0 
这个问题我也不懂。你觉得烦就别用它喽。
C语言为什么要用?我不知道。我只知道一些加密算法都用位运算,如MD5,SHA1之类的。
然后,我感觉有些运算用位运算会较快吧,还有一些写法用位运算表示会很好,如2的32次方,如果输入它的值,错了也看不出来,不用位运算难道用幂函数去算么?
浅学粗见,楼下的众多高手尽管批。

QQ群:C语言初级群:31066229
   JAVA2自学交流群(筹备中):31066388
UC群:C语言学习:10051714
2011-02-20 20:06
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
除了左移右移的乘除法运算
还有 或(|) 异或(^) 与(&) 取反(~)这些运算
这些主要用于宏定义的  用二进制位来表示各种含义  也就是标志
一般数据类型是DWORD 32位
其实就是用一些二进制数来确定函数 的执行标志 也就是标志参数
我的感觉   呵呵

                                         
===========深入<----------------->浅出============
2011-02-20 20:15
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
汇编里, 常常用到位操作的! 简单的例子比如做乘2除2,如果用mul或div的话, 效率上远远没有shl/shr高。

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-02-20 20:51
犬虫门心
Rank: 8Rank: 8
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
注 册:2011-1-25
收藏
得分:0 
以下是引用lyj23在2011-2-20 19:58:30的发言:

    位运算这么烦,它有什么用啊!现在计算机技术发达,内存空间不大可能不够用,‘<<’ 运算符 ‘>>’ 运算符只不过能算乘法、除法,还要转换成二进制算会不会溢出!
    高手来告诉我,位运算的好处是什么?C语言为什么要用低级语言的位运算?
楼主过于心急了:因为看不到现实的利益,于是就心理压力了。淡定、淡定。我这里给你说3个例子:
1、现在计算机技术发达不错,而且CPU的速度也很快,但是我相信楼主对于开机的等待过程、某些软件在运行时的速度都可能让楼主心烦(和位运算一样烦)。那么,我先假定一种运算(虽说是假定,但确实有意义的,不过说出来,以你现在的水平,只能是烦上添烦,请你当成是一个事实),是很简单的乘法运算:
i * 94
但是这个运算要被程序非常频繁的处理到,频繁到这样的程度:只有i*94的运算速度再快些,这个软件的功能才能被用户所接受。
而要加快它的运算,最好的方法就是位运算,注意看下面的推导:
i * 94 = i * (64+30) = i*64 + i*(32-2) = i<<6 + i<<5 - i<<1
最后面的式子在CPU中的运行速度要比前面快很多(原因你去看计算机工作原理方面的书籍)

2、压缩/解压缩技术
如果不压缩到极点,那就不可能真正地把信息“压缩”,那这个极点就是“压缩到位”。(这个例子很含糊)

3、IP地址和子网掩码
这就是位运算在网络中的应用。TCP/IP协议(软件)和其他很多协议都是用C(纯C,而非C++)编写的。

当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
2011-02-20 21:30
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
因为移位、加减法指令都使用非常简单的硬件逻辑实现,执行速度快, 相对来说,乘除法的硬件电路比较复杂,执行速度相对要慢很多。比如在16位的X86CPU里执行乘法要花上100+以上的时钟周期,而采用移位加减法指令只需要几个时钟周期。

还有有的时候对外围设备检测是否准备好信号的时候, 位操作就派上大用场啦。

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-02-20 21:47
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
一个变量标识多个状态

假如 敌人发出的子弹 消失方式有: 超出屏幕 消失, 击中目标 消失

#define OUT_SCREEN 0
#define HIT_TARGET 1

if((state & (1 <<OUT_SCREEN)) || (state & (1 <<HIT_TARGET )))
{
    ...;
    setBulletDisable();
}


[ 本帖最后由 BlueGuy 于 2011-2-20 23:41 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2011-02-20 23:39
赤壁男儿
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2009-12-26
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>
#define MASK 0xffL  /* 带上'L'相当于声明了一个长整型数值 */
void main()
{
    unsigned long IP_address;
    unsigned int HighByte,SecondByte,ThirdByte,LastByte;
    printf("Please enter hex IP address:");
    scanf("%lx",&IP_address);
    HighByte   = (IP_address >> 24) & MASK;
    SecondByte = (IP_address >> 16) & MASK;
    ThirdByte  = (IP_address >> 8 ) & MASK;
    LastByte   = IP_address         & MASK;
    printf("Your entered 0x%x\n",IP_address);
    printf("The IP address is: %d.%d.%d.%d\n",HighByte,SecondByte,ThirdByte,LastByte);
}
2011-05-14 11:25
快速回复:位运算的问题
数据加载中...
 
   



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

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