VisualBasic 版 (精华区)

发信人: zkboy (小小鸟), 信区: VisualBasic       
标  题: Re: 请教:如何在VB中实现16进制数或10进制数与2进制�
发信站: BBS 水木清华站 (Thu Jun 15 19:39:37 2000)

转一篇相关资料
   在编程中,我们经常使用二进制(binary)、八进制(octal)、十进制(decimal)和十
六进制(hexadecimal)来表示一个数据,除二进制可表示大部分数据外,我们一般用其他
的进制来表示整型数。它们之间的转换有时显得非常重要,但VB本身提供的转换函数很
少。这样,就需要我们根据VB程序的特点自己来设计转换函数。以下向大家介绍几种转
换方法,虽然不能放之四海皆准,瑾希望能激发您的思路。
一、VB提供的进制转换函数
1、Hex(x)
返回十六进制数值的String类型,注意
(1)其返回的是String类型;
(2)函数返回值最多是8个十六进制字符;
(3)x为整数,如果x不是整数将先被四舍五入成最接近的整数。
2、Oct(x)
返回八进制数值的 Variant(String)类型,注意
(2)函数返回值最多是11个八进制字符;
(3)x为整数,如果x不是整数将先被四舍五入成最接近的整数。
VB只有这两个进制转换函数。
二、自己设计转换函数
1、十六进制 -> 十进制 :
lngDec = CLng("&H" & strHex)
你看,仅这么一个表达式就能完成转换。为什么用Clng( )而不用Val( )?这只是为了避
免数值范围的限制。
2、八进制 -> 十进制 :
提示,VB中八进制数以&O为前缀,通过上面您一定能写出转换表达式。
3、十六进制 -> 二进制 :
Function Hex2Bin(HexValue As String) As String
    Const BinIndexTable = "0000000100100011010001010110011110001001101010111
100110111101111"
   Dim n As Integer
   Dim Tmp As String
   Tmp = ""
   For n = 1 To Len(HexValue)
       Tmp = Tmp + Mid(BinIndexTable, _
      (Val("&H" + Mid(HexValue, n, 1) - 1) * 4 + 1), 4)
   Next
   Hex2Bin = Tmp
End Function
我们知道1位十六进制数代表4位二进制。这里用到一个索引表BinIndexTable,经过对给
定的十六进制数逐位分离、检索索引表、转换、合并,就可以得到结果。和前面的转换
比较,这里用到了Val( )函数,因为保证的前提是1位十六进制最大表示为十进制的15。
是看起来这种方法很原始,但它是最简便的,并且运行速度最快。
4、用两个函数来完成各种进制间的转换:
Function ConvertBase(NumValue As String, BaseFrom As Integer, BaseTo As Inte
ger) _
As String
' 转换一个数值(NumValue)从一种进制(BaseFrom)到另一种进制(BaseTo)
'
' 用一个整数来表示各种进制:
' 二进制 = 2
' 八进制 = 8
' 十进制 = 10
' 十六进制 = 16
'
' NumValue是给定的数值字符串,包括 0 - 9, A - Z
' BaseFrom是给定的数值的进制,可以是2与36间的任何整数
' BaseTo是希望转换成的进制,可以是2与36间的任何整数
'
' 函数返回希望得到的进制数,是一个String类型
Dim i As Integer
Dim PlaceValue As Integer
Dim CurrentCharacter As String
Dim CharacterValue As Integer
Dim RunningTotal As Double
Dim Remainder As Double
Dim BaseOutDouble As Double
Dim NumInCaps As String
'确认NumValue有效
If NumValue = "" Or BaseFrom < 2 Or BaseFrom > 36 _
Or BaseTo < 1 Or BaseTo > 36 Then
    ConvertBase = "Error"
    Exit Function
End If
'使字母为大写
NumInCaps = UCase(NumValue)
'先将给定的数转换为十进制
PlaceValue = Len(NumInCaps)
For i = 1 To Len(NumInCaps)
PlaceValue = PlaceValue - 1
CurrentCharacter = Mid(NumInCaps, i, 1)
CharacterValue = 0
If Asc(CurrentCharacter) > 64 And _
Asc(CurrentCharacter) < 91 Then
     CharacterValue = Asc(CurrentCharacter) - 55
End If
If CharacterValue = 0 Then
If Asc(CurrentCharacter) < 48 Or _
Asc(CurrentCharacter) > 57 Then
   ConvertBase = "Error"
   Exit Function
Else
   CharacterValue = Val(CurrentCharacter)
End If
End If
If CharacterValue < 0 Or CharacterValue > BaseFrom - 1 Then
   ConvertBase = "Error"
   Exit Function
End If
RunningTotal = RunningTotal + CharacterValue * (BaseFrom ^ PlaceValue)
Next i
' 将得到的十进制数转换为目标进制
Do
BaseOutDouble = CDbl(BaseTo)
Remainder = ModDouble(RunningTotal, BaseOutDouble)
RunningTotal = (RunningTotal - Remainder) / BaseTo
If Remainder >= 10 Then
CurrentCharacter = Chr(Remainder + 55)
Else
CurrentCharacter = Right(Str(Remainder), _
Len(Str(Remainder)) - 1)
End If
ConvertBase = CurrentCharacter & ConvertBase
Loop While RunningTotal > 0
End Function
Function ModDouble(NumValue As Double, DivNum As Double) As Double
   '返回一个由小数点分开的数,用语Double数据类型
   ModDouble = NumValue - (Int(NumValue / DivNum) * DivNum)
End Function
这里的自定义函数能很好的完成转换的任务,尤其是可以转换Double数据类型,这点在
使用Windows注册表编程时很有用(转换DWords)。代码很复杂,需要脑子不停的转动,
请您仔细理解。其实这只是一个通用的函数,您可以提取思路用于自己的特定功能。
调用方法:
Dim theValue As String
'十进制 -> 十六进制
theValue = ConvertBase("100", 10, 16)
'二进制 -> 八进制
theValue = ConvertBase("100", 2, 8)
'十进制 -> 三进制
theValue = ConvertBase("100", 10, 3) 
【 在 suliangfeng (疯子) 的大作中提到: 】
:    我需要把一10进制的数转为2进制,然后提取低7位,请问如何实现,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vim求生

[TOC] Vim 是从 vi 发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器。 —— 维基百科 很多接触 Vim 的程序员应该都有过这样的经历&#xff1a; 受某大 V 的…

activemq 内存_ActiveMQ:了解内存使用情况

activemq 内存正如最近的一些邮件列表电子邮件和Google返回的许多信息所表明的那样&#xff0c;ActiveMQ的SystemUsage尤其是MemoryUsage功能使一些人感到困惑。 我将尝试解释有关MemoryUsage的一些细节&#xff0c;这些细节可能有助于理解它的工作方式。 我将不介绍StoreUsage…

osg动态加载模型不显示_OSG仿真案例(8)——读取FBX格式文件并显示(无动画)...

包含的头#include #include #include #include #include #include #include #include #include using namespace std;所需要的类(结构体)struct AnimationManagerFinder : public osg::NodeVisitor{osg::ref_ptr<:basicanimationmanager> _am;AnimationManagerFinder(){o…

用微服务和容器替换旧版Java EE应用程序服务器

Lightbend最近对2000多个JVM开发人员进行了调查&#xff0c;结果刚刚发布。 开展该调查的目的是发现&#xff1a;发展趋势与IT基础设施趋势之间的相关性&#xff0c;处于数字化转型前沿的组织如何使他们的应用程序现代化以及当今对新兴开发人员技术最为关注的实际生产使用情况细…

点分治经典_动态点分治

HYSBZ_3730_震波 背景&#xff1a;这是接触的动态点分治第一题&#xff0c;开始不是很理解&#xff0c;看了很久&#xff0c;写了很久才理解了动态的动态所在。前置知识&#xff1a;静态点分治&#xff08;主要是容斥思想&#xff0c;一般看出来是点分治的话&#xff0c;想到怎…

python settings模块导入不了_无法导入设置“myproject.settings”(是否在sys.path上?):没有名为pinax的模块...

我正试图让皮纳克斯在网络派系工作&#xff0c;有这么多的问题。。。[Sun Feb 19 20:01:20 2012] [error] [client 127.0.0.1] mod_wsgi (pid22796): Exception occurred processing WSGI script /home/pawesome/webapps/qtsocial/myproject.wsgi.[Sun Feb 19 20:01:20 2012] […

VS2012 颜色配置成黑色

效果展示&#xff1a; 步骤&#xff1a; 1、工具->选项->环境->常规->颜色体验 选为深色 2、在http://studiostyl.es/schemes/son-of-obsidian中&#xff0c;下载Son of Obsidian字体设置&#xff0c;然后 工具->导入和导出设置->导入选定的环境设置->…

@bzoj - 2388@ 旅行规划

目录 descriptionsolutionaccepted codedetailsdescription 请你维护一个序列&#xff0c;支持两种操作&#xff1a; &#xff08;1&#xff09;某个区间 [x, y] 内的数同时加上一个增量 k。 &#xff08;2&#xff09;询问某一个区间 [x, y] 中从 1 开始的最大前缀和。 input …

java与java ee_Java EE 7社区调查结果!

java与java ee在JSR 342下可以继续进行Java EE 7的工作。一切都在顺利进行&#xff0c;Java EE 7现在处于早期草稿审查阶段。 在11月初&#xff0c; Oracle发布了一个有关即将推出的Java EE 7功能的小型社区调查 。 昨天结果公布了。 超过1,100名开发人员参加了调查&#xff0…

浅谈C++中内存分配、函数调用和返回值问题

在谈述函数调用和返回值问题之前&#xff0c;先来看看C中内存分配的问题。 C编译器将计算机内存分为代码区和数据区&#xff0c;很显然&#xff0c;代码区就是存放程序代码&#xff0c;而数据区则是存放程序编译和执行过程出现的变量和常量。数据区又分为静态数据区、动态数据区…

dataguard从库数据库丢失恢复例子(模拟所有的控制文件)

1.退出日志应用模式[oraclelocalhost ~]$ sqlplus /nolog SQL*Plus: Release 11.2.0.4.0 Production on Mon Jan 14 16:09:16 2019 Copyright (c) 1982, 2013, Oracle. All rights reserved. SQL> connect / as sysdbaConnected.SQL> alter database recover managed sta…

python教程自带数据库_python教程自带数据库 | Python学哪个数据库

python使用数据库增条数据import pymysql#返回Connection#host"localhost"con pymysql.connect(host"192.168.31.28",port3306,user"atguigu",password"atguigu",db"atguigudb",charset"utf8")#返回cursor对象cu…

Java SE 8新功能介绍:使用新的DateTime API计算时间跨度

使用Java SE 8新的DateTime API JSR 310…可以实现更清晰&#xff0c;可读且功能强大的编码。 Java SE 8&#xff0c;JSR 310 在上一篇文章“ 使用Streams API处理集合 ”中&#xff1b; 我已深入探讨和探索如何使用流遍历集合&#xff0c;如何从集合和数组创建流以及最终汇总…

使用VS2012内建的C++测试架构进行单元测试

前言 在软件开发的过程中&#xff0c;单元测试(Unit testing)是一个重要的coding步骤&#xff0c;可以让你的程序代码质量大幅提升、协助你进行良好的程序架构设计&#xff0c;单元测试是针对程序单元(软件设计的最小单位)来进行正确性检验的测试工作&#xff0c;在程序化编程中…

【博 客 文 章】

1、C#中的Explicit和Implicit转载于:https://www.cnblogs.com/kikyoqiang/p/10270416.html

sql intersect mysql_SQL INTERSECT子句

SQL INTERSECT子句/操作符用于合并两个SELECT语句&#xff0c;但只从第一个SELECT语句返回完全相同于第二个SELECT语句结果的所有行。这意味着INTERSECT是由两个SELECT语句返回相同的行(唯一)。正如使用UNION操作&#xff0c;同样的规则可使用在INTERSECT运算符。 但MySQL不支持…

vs2010下release版本调试设置

设置在Release模式下调试的方法&#xff1a; 1.工程项目上右键 -> 属性 2.c -> 常规 -〉调试信息格式 选 程序数据库(/Zi)或(/ZI), 注意&#xff1a;如果是库的话&#xff0c;只能(Zi) 3.c -> 优化 -〉优化 选 禁止&#xff08;/Od&#xff09; 4.连接…

控制反转 java_控制反转( Ioc)快速入门

2.1 什么是控制反转(IOC&#xff1a;Inverse of Control)IOC反转控制&#xff0c;实际上就是将对象的创建权交给了Spring&#xff0c;程序员无需自己手动实例化对象。可以看出来工厂的作用就是用来解耦合的&#xff0c;而在使用spring的过程中&#xff0c;spring就是充当这个工…

spring 工作流引擎_带Spring的简单工作流引擎

spring 工作流引擎几个月前&#xff0c;在处理一个公司项目时&#xff0c;我们需要开发REST服务&#xff0c;该服务用于根据客户端应用程序发送的数据发送电子邮件。 在开发此服务期间&#xff0c;我们决定创建简单的工作流引擎&#xff0c;该引擎将为发送电子邮件收费&#xf…

如何成为一个牛逼的C/C++程序员? (仔细阅读)

这个题目的噱头太大&#xff0c;要真的写起来&#xff0c; 足够写一本书了。 本人是过来人&#xff0c; 结合自身的体会和大家交流一下&#xff0c;希望新人能少走弯路。 每个人的情况不一样&#xff0c;我下面的描述可能并不适合每一个看到这篇文章的人。 一、C/C语言 如果你的…