LaTex+MarkDown+Pandoc组合套件写博客的处女作,试试效果。各自的分工为:Latex下编辑公式,在Sublime Text 2下使用Markdown排版,最后用Pandoc导出。

摘要

本文主要讲解 Binary , Unsigned , Signed 三种数据中任意两者之间的转换。下面是文中的一些约定写法。

  • 转换名称

    • B2Uw(x) : 将位数为w的二进制数 binary 转换为无符号数Unsigned
    • B2Tw(x) : 将位数为w的二进制数 binary 转换为补码 Two's complement
  • 二进制数的表示 (x) : 用一个向量表示,x = ( x1 , x2 , ... , xw)

1. U2Bw(x)

直接用辗转相除法即可。

2. S2Bw(x)

正数直接装换,然后左边添加0 ; 负数先将其绝对值装换成二进制数,再对低w-1位取反,最高位添加1,用公式表示即为: 下面以三位的三进制数来说明有符数的补码表示

  • 3 = 011
  • 2 = 010
  • 1 = 001
  • 0 = 000
  • -1 = 111
  • -2 = 110
  • -3 = 101
  • -4 = 100

3. B2Uw(x)

\begin{equation} B2U_w\left( \overrightarrow{x} \right) \doteq \sum_{i=0}^{w-1} x_i 2^i \label{B2U} \end{equation}

4. B2Tw(x)

\begin{equation}B2T_w\left( \overrightarrow{x} \right) \doteq -x_{w-1} 2^{w-1} + \sum_{i=0}^{w-2} x_i 2^i \label{B2T} \end{equation}

5. T2Uw(x)

函数 T2Uw(x) 定义为 T2Uw(x) = T2Bw(B2Uw(x)) 。这个函数输入的是一个 -2(w-1) ~ 2(w-1)-1 之间的数,而输出的无符数也即为该有符数的补码表示。
对于位模式 下的有符二进制数 $\overrightarrow{x}$ ,对比式($\ref{B2U}$) 和式($\ref{B2T}$) , 计算两者之差,我们就可以得到:$ B2U_w\left( \overrightarrow{x} \right) - B2T_w\left( \overrightarrow{x} \right) = x_{w-1}  \left( 2^{w-1} - \left( -2^{w-1} \right) \right)  =  x_{w-1} 2^w $ 。这样就得到了:$B2U_w\left( \overrightarrow{x} \right) = x_{w-1} 2^w + B2T_w\left( \overrightarrow{x} \right)$。若令 $\overrightarrow{x} = T2B_w \left( x \right) $ ,则其反函数为 $ x = B2T_w \left( \overrightarrow{x} \right) $。  由前面三式以及T → B → U变换的传递性,可得:

\begin{equation} B2U_w\left( T2B_w \left( x \right) \right) = T2U_w \left( x \right) = x_{w-1} 2^w + x \label{T2U} \end{equation}
这个关系对于理解“有符数变换得到的无符数也即补码”很有用。

$$ T2U_w \left( x \right)=\left\{
\begin{aligned}
& x+2^w, & x<0,x_{w-1}=1 \\
& x, & x \geq 0,x_{w-1}=0 
\end{aligned}
\right.$$

下图说明了 T2U 的转换行为:对于非负数(x ≥ 0), T2U 保留原值 :

图1. 从补码到无符号数的转换。函数 将负数转换为大的正数

6. U2Tw(x)

函数 U2Tw(x) 定义为 U2Tw(x) = B2Tw(U2Bw(x)) 。这个函数输入的是一个 0 ~ 2(w-1)-1 之间的数,输出则为一个 -2w ~ 2(w-1) 之间的数。
上一节我们已经得到,对于负数(x < 0),T2U 被装换为一个大于2w − 1的正数。
反过来,我们再来推导无符号数 u 和与之对应的有符号数 U2Tw(u)之间的关系。 利用上一节的结论, $B2T_w\left( \overrightarrow{u} \right) = B2U_w\left( \overrightarrow{u} \right) - u_{w-1} 2^w$ 。若令 $\overrightarrow{u} = U2B_w \left( u \right)$,则其反函数为 $u = B2U_w \left( \overrightarrow{x} \right)$ 。由前面三式以及 T → B → U 变换的传递性,可得:

\begin{equation}B2T_w\left( U2B_w \left( u \right) \right) = U2T_w \left( u \right) = u - u_{w-1} 2^w \label{U2T} \end{equation}

在 u 原始的无符号表示法中,最高位uw − 1决定了 u 是否大于或等于 2w − 1, 无符数 u 到有符数的装换分段表示为:

$$ U2T_w \left( u \right)=\left\{
\begin{aligned}
& u, & u<2^{w-1},x_{w-1}=0 \\
& u-2^w, & x \leq 0,x_{w-1}=1
\end{aligned}
\right.$$

下图说明了 U2T 转换行为:对于小的数(u < 2w − 1), U2T 保留原值 ; 对于大的数(u ≥ 2w − 1),U2T 被装换为一个负数:

图2.从无符号数到补码的转换。函数U2T 把大于 的数字转换为负值

练习

1.如下函数,在32bit系统中,求问foo(2^31-3)的值是:

int foo(int x) {
return x&-x;
}

A.0  B.1  C.2   D.4

解答:

  • (1).运算符号的优先级,减号 '-' 高于异或 '^' 。所以 231-3=2(31-3)=2^28=30
  • (2).32位机器中int整型的位数的为 w=32 ,位运算 x 取反,其实为 0xFFFFFFFF-x ,而不是用 232 减去。
  • (3).本题中,x=30=0x1E ,依据 T2Uw 可得 -x=0xFFFFE2,所以_x&-x=2_,本题选B
  • (4)有么有更简单方法。

y = x & (-x)
That does a bitwise AND between the variable x and its negation, and assigns the result to the variable y. If your system uses two's complement signed arithmetic , then what that manages to get you is the greatest power of 2 that is a factor of x. So, if x is 24, y gets assigned 8, and if x is 12, y gets assigned 4, and if x is 99, y becomes 1. To understand why it does that, you need to understand binary, and two's complement. Look them up on wikipedia.

  • 用 15, 16 ,48 三个数验证结论

    • x=15=0x0F , -x=-15=232-0x0F=0xFFFFFFF1 , 所以 x&-x=0xF1 & 0x0F = 1 ;
    • x=16=0x10 , -x=-16=232-0x10=0xFFFFFF0 , 所以 x&-x=0xF0 & 0x10 = 16
    • x=48=0x30 , -x=-48=232-0x30=0xFFFFFD0 , 所以 x&-x=0xD0 & 0x30 = 16
  • 总结起来就是, x&-x 得到的是数x的最低一位的非0比特数。

reference

  1. CASPP

  2. yahoo关于y = x & (-x)问题的解答

[CSAPP笔记]Binary , Unsigned , Signed 之间的相互装换的更多相关文章

  1. DOM对象 与 jQuery对象 之间的相互装换

    示例代码: //jQuery对象转DOM对象 //因为jQuery对象是一个数组对象,所以转换为DOM对象时要用索引的形式 var $div1 = $("#div1"); //jQ ...

  2. int和string的相互装换 (c++)

    int和string的相互装换 (c++) int转换为string 第一种方法 to_string函数,这是c++11新增的函数 string to_string (int val); string ...

  3. canvas和图片之间的互相装换

    canvas和图片之间的互相装换 一.总结 一句话总结:一个是canvas的drawImage方法,一个是canvas的toDataURL方法 canvas drawImage() Image对象 c ...

  4. Map 与 JavaBean 的相互装换

    目的 为了方便使用 DbUtils,在插入数据时需要传入含有占位符的 SQL 语句和对应占位符的值(数组),封装代码如下: /** * 插入实体 */ public static <T> ...

  5. xml与java代码相互装换的工具类

    这是一个java操作xml文件的工具类,最大的亮点在于能够通过工具类直接生成xml同样层次结构的java代码,也就是说,只要你定义好了xml的模板,就能一键生成java代码.省下了自己再使用工具类写代 ...

  6. python基础知识-集合,列表,元组间的相互装换

    在python中列表,元祖,集合间可以进行相互转化, def main(): set1={'hello','good','banana','zoo','Python','hello'} print(l ...

  7. 别名现象,java对象之间的相互赋值

    请看一下代码 import java.util.*; class book{ static  int c = null; } public static void main(String[] args ...

  8. ios tweak之binary not signed (use ldid -S)问题解决

    参考tweak教程写了个简单的tweak,无奈完全无效果,摸索了好长时间才找到方法: 打开terminal ssh root@192.168.1.100 vim /var/log/syslog 找到如 ...

  9. JAVA和C/C++之间的相互调用。

    在一些Android应用的开发中,需要通过JNI和 Android NDK工具实现JAVA和C/C++之间的相互调用. Java Native Interface (JNI)标准是java平台的一部分 ...

随机推荐

  1. [BZOJ2733]永无乡

    Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...

  2. 【论文解析】MTCNN论文要点翻译

    目录 0.论文连接 1.前言 2.论文Abstract翻译 3.论文的主要贡献 4.4 训练 5 模型性能分析 5.1 关于在线挖掘困难样本的性能 5.2 将人脸检测与对齐联合的性能 5.3 人脸检测 ...

  3. codeforces208E Blood Cousins

    题目链接:codeforces208E 正解:$dsu$ $on$ $tree$ 解题报告: 又是一波$dsu$ $on$ $tree$咯… $p$级$cousin$其实就是对于$x$的$p$级祖先统 ...

  4. linux pgrep命令的使用

    pgrep 是通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行. 常用参数 -l 列出程序名和进程ID -o 进程起始的ID -n 进程终止的ID $ ps -ef | grep mys ...

  5. 如何高效的使用 Git

    -- 代码昨天还是运行好好的今天就不行了. 代码被删了. 突然出现了一个奇怪的 bug,但是没人知道怎么回事. 如果你出现过上面的任何一种情况,那本篇文章就是为你准备的. 除了知道 git add, ...

  6. angular $q的学习笔记转帖

    http://blog.segmentfault.com/bornkiller/1190000000402555 angular $q的一个不错的学习笔记

  7. mongo docker image

    mongo 保存压缩镜像 docker save -o ~/Desktop/mongo.tar mongo 7za a -mx=9 ~/Desktop/mongo.tar{.7z,} 导入或拉取镜像 ...

  8. Python 字典的一键多值,即一个键对应多个值

    转自:http://blog.csdn.net/houyj1986/article/details/22624981 #encoding=utf-8 print '中国' #字典的一键多值 print ...

  9. HDU 4669 Mutiples on a circle 不知道该归为哪一类。

    题意:给你N个珠宝和一个K,每个珠宝上面都有数字,这个珠宝做成项链,把珠宝上的数字拼起来如果可以整除掉K,那么久说这个数字为wonderful value,问你有多少种方案可以组成WONDERFUL ...

  10. Ubuntu下压缩解压文件

    一般来说ubuntu 下带有tar 命令,可以用来解压和压缩之用.但是我们经常要与win下用户打交道,所以要安装一些解压工具如:rar zip 等命令. 如果要需要用到zip工具那么可以: sudo ...