vc中float与DWORD的互想转换实现代码

引子:在看《龙书》的时候有个float到DWORD的转换函数不理解。

DWORD d3d::FtoDw(float f) 

{ 

  return *((DWORD*)&f); 

}

背景: 有些函数需要传入DWORD类型的变量,但是该变量的实际意义是用小数来表示的。这里就需要在不改变float本身值的情况下传入一个DWORD变量。

一段网上的代码

DWORD dw = 0;
float f1 = 0.25;  

cout<<"f1 = "<<f1<<endl;  

dw = *((DWORD*)&f1);
cout<<"dw = *((DWORD*)&f1): "<<dw<<endl;  

f1 = 0.0;
cout<<"f1 = 0.0: "<<f1<<endl;  

f1 = *((float*)&dw);
cout<<"f1 = *((float*)&dw): "<<f1<<endl;  

运行结果是

f1 = 0.25
dw = *((DWORD*)&f1): 1048576000
f1 = 0.0: 0
f1 = *((float*)&dw): 0.25 

这里利用的是编译器转型的手段,对于任何字节对等的类型都适用,比如float到int,double到long等等。这样的转换可以保证二进制数据不丢失,从而保证数据的完整性。

颜色转换,float <->DWORD

在DirectX程序中有些地方用DWORD(RGBA)格式表示颜色,其范围是[0 - 255],在shader中则都以float来表示颜色,其范围是[0.0 - 1.0],两者间的转换规则如下:

DWORD -> float 将DWORD除以255
float -> DWORD 将float值乘以255
举个例子,127 / 255 = 0.5,0.1 * 255 = 25

(0)

相关推荐

  • vc++实现的tcp socket客户端和服务端示例

    Tcp Server 复制代码 代码如下: #include <WinSock2.h>#include <stdio.h> #pragma comment(lib, "ws2_32.lib") int main(){ // initial socket library WORD wVerisonRequested; WSADATA wsaData; int err; wVerisonRequested = MAKEWORD(1, 1); err = WSASta

  • VC6.0实现读取Excel数据的方法

    Excel是常用的办公软件之一,本文以Excel2003为例说明VC程序读取Excel文件的方法.具体步骤如下:   1.首先要将excel类添加到工程中. 在ClassWizard中,[Add Class],在Excel的安装目录找到Excel.exe(Microsoft2003是Excel.exe:2007应该又独立的lib库,这个没有验证),添加必要的几个类: // Excel应用对象 _Application m_oExcelApp; // Excel程序 _Worksheet m_oW

  • VC List Control控件如何删除选中的记录实例详解

    VC List Control控件如何删除选中的记录实例详解 实例代码: OnButtonDelete() { POSITION pos = m_list.GetFirstSelectedItemPosition(); int idx = m_list.GetNextSelectedItem(pos); while (idx != -1){ LVITEM lvi; lvi.iItem = idx; lvi.iSubItem = 0; lvi.mask = LVIF_IMAGE; if (m_li

  • VC WinExec打开指定程序或者文件的方法

    ⑴ 函数原型: UINT Win Exec(LPCSTR lpCmdLine, UINT uCmdShow); ⑵ 参数: lpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程序的命令行(文件名加上可选参数). uCmdShow:定义Windows应用程序的窗口如何显示,并为CreateProcess函数提供STARTUPINFO参数的wShowWindow成员的值. ⑶ 返回值: 若函数调用成功,则返回值大于31.若函数调用失败,则返回值为下列之一: ① 0:系统内存或资源已耗

  • VC定时器的用法实例详解

    本文实例讲述了VC中定时器的用法,分享给大家供大家参考.具体用法分析如下: 定时器在VC中的使用频繁,其原型为: 复制代码 代码如下: WINUSERAPI UINT WINAPI SetTimer ( HWND hWnd , UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc); 其中的参数用法如下: hWnd       是欲设置定时器的窗体句柄.定时时间到时,系统会向该窗体发送WM_TIMER消息. nIDEvent     定时器标识符.

  • VC双画布消除屏幕闪烁实例详解

    VC双画布消除屏幕闪烁实例详解 在vc中贴图时,直接贴图到屏幕的CDC,会因为图面贴入的时间不同而造成屏幕的闪烁.解决这个问题的办法是先把图面画到内存画布上,在一次画到屏幕,内存映射到屏幕很快,所以不会造成闪烁. 实例代码: CDC m_dcMem; //创建内存画布 CBitmap m_bmpMemDC; //创建内存画布的 //初始化内存画布 CDC* pDC = GetDC(); if(pDC->GetSafeHdc()) { if(!m_dcMem.CreateCompatibleDC(

  • VC++中的字体设置方法详解

    VC++中static text字体改变 窗口都有2个和字体有关的函数:CWnd::GetFont()和SetFont(CFont*, BOOL);1)CFont* pFont = m_static.GetFont(); 2)LOGFONT LogFont;pFont->GetLogFont(&LogFont); 3)对LogFont直接操纵修改里面的字体选项 //如LogFont.lfUnderline = 1;设置下划线 LogFont.lfHeight=30;       //字体大小

  • vc中float与DWORD的互想转换实现代码

    引子:在看<龙书>的时候有个float到DWORD的转换函数不理解. DWORD d3d::FtoDw(float f) { return *((DWORD*)&f); } 背景: 有些函数需要传入DWORD类型的变量,但是该变量的实际意义是用小数来表示的.这里就需要在不改变float本身值的情况下传入一个DWORD变量. 一段网上的代码 DWORD dw = 0; float f1 = 0.25; cout<<"f1 = "<<f1<

  • Asp.Net中的字符串和HTML十进制编码转换实现代码

    Asp.Net将字符串转为&#区码位编码,或者将&#区码位编码字符串转为对应的字符串内容. &#数字;这种编码其实就是将单个字符转为对应的区码位(数字),然后区码位前缀加上"&#",后缀加上";"组成,对于这种编码的字符串,浏览器会自动解析为对应的字符. Asp.Net字符串和&#编码转换源代码和测试代码如下: using System; using System.Text.RegularExpressions; public

  • VC++中HTControl的CHTButton按钮控件类用法实例解析

    本文以实例形式讲解了VC++中HTControl控件类的CHTButton按钮控件类用法,相信对大家更好的理解VC++有一定的帮助.具体内容如下: 一般了解VC++的朋友都知道,VC++ 按钮控件CHTButton隶属HTControl控件组,直接由WIN32 API实现,你可以在SDK,MFC,wxWidget等环境下使用它.支持生成各种类型的按钮,比如:普通按钮,PNG透明按钮,复选框按钮,单选按钮等.使用时请注意,窗体必须动态创建,代码段如下: m_HTBtnClose.Create(75

  • VC++中图像处理类CBitmap的用法

    VC++中图像处理类CBitmap的用法 class CBitmap : public CGdiObject { DECLARE_DYNAMIC(CBitmap) public: static CBitmap* PASCAL FromHandle(HBITMAP hBitmap); // Constructors CBitmap(); BOOL LoadBitmap(LPCTSTR lpszResourceName); BOOL LoadBitmap(UINT nIDResource); BOO

  • VC++中进程与多进程管理的方法详解

    本文实例讲述了VC++中进程与多进程管理的方法,分享给大家供大家参考.具体方法分析如下: 摘要: 本文主要介绍了多任务管理中的多进程管理技术,对进程的互斥运行.子进程的创建与结束等作了较详细的阐述. 关键词: VC++6.0:进程:环境变量:子进程 进程 进程是当前操作系统下一个被加载到内存的.正在运行的应用程序的实例.每一个进程都是由内核对象和地址空间所组成的,内核对象可以让系统在其内存放有关进程的统计信息并使系统能够以此来管理进程,而地址空间则包括了所有程序模块的代码和数据以及线程堆栈.堆分

  • 浅谈VC中预编译的头文件放那里的问题分析

    用C++写程序,肯定要用预编译头文件,就是那个stdafx.h.不过我一直以为只要在.cpp文件中包含stdafx.h 就使用了预编译头文件,其实不对.在VC++中,预编译头文件是指放到stdafx.h中的头文件才会有效果.如下: file: stdafx.h 复制代码 代码如下: // stdafx.h : include file for standard system include files,// or project specific include files that are u

  • VC中CWinThread类以及和createthread API的区别分析

    本文实例讲述了VC中CWinThread类以及和createthread API的区别分析,分享给大家供大家参考.具体分析如下: CWinThread CObject  └CCmdTarget     └CWinThread CWinThread对象代表在一个应用程序内运行的线程.运行的主线程通常由CWinApp的派生类提供:CWinApp由CWinThread派生.另外,CWinThread对象允许一给定的应用程序拥有多个线程. CWinThread支持两种线程类型:工作者线程(Worker

  • VC中实现文字竖排的简单方法(推荐)

    好多人都觉得在VC中实现文字竖排是一件很难的事情,其实可以使用"躺"着的字体很方便的实现文字竖排. Windows中有一些字体是"躺"着的,例如:@Fixedsys.@System.@宋体.@黑体等等,有很多,这些字体和不加@的字体的唯一区别就是用这些字体显示的文字是"躺"着的.如下图: 对这些"躺"着的字体进行270°的旋转就可以实现文字竖排了,效果如下: 以下代码可以产出竖排的宋体. CFont font; CFont *

  • VC中使用ADO开发数据库应用程序简明教程

    本文实例讲述了VC中使用ADO开发数据库应用程序的方法.分享给大家供大家参考,具体如下: 一.ADO概述 ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口.ADO 使您能够编写应用程序以通过 OLE.DB 提供者访问和操作数据库服务器中的数据.ADO 最主要的优点是易于使用.速度快.内存支出少和磁盘遗迹小.ADO 在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量.高性能的接口.之所以

  • 解析VC中创建DLL,导出全局变量,函数和类的深入分析

    一.创建DLL1.在VC中新建一个Win32空项目MathLib:2.添加预编译头文件stdafx.h,定义导入导出控制符号: 复制代码 代码如下: //stdafx.h#pragma once#define MATHLIB_EXPORT 3.添加包含要导出的全局变量,函数和类的头文件MathLib.h: 复制代码 代码如下: //MathLib.h #pragma once #ifdef MATHLIB_EXPORT #define MATHLIBAPI __declspec(dllexpor

随机推荐