`

为什么16进制数要与OxFF与运算

阅读更多
为什么16进制数要与OxFF与运算
以下是MD5加密算法示例,其中使用了 OxFF的与运算:
@Test
public void md5() throws Exception{
String pwd = "1234";
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bts = md.digest(pwd.getBytes());//16位
pwd = "";
for(byte bt : bts){
System.err.println("src: "+bt);
String str = Integer.toHexString(bt);
System.err.println("src:-----"+str);
str = Integer.toHexString(bt & 0xFF);//为儿在算MD5时为什么与要0xff进行与运算呢
System.err.println("dest:"+str);
if(str.length()<=1){
str+="f";
}
pwd+=str;
System.err.println("---------------------------------");
}
System.err.println("最后的密码是:"+pwd);
}
我们要讨论的主要问题是,为什么上面注解处要与OxFF进行与运算而不是其他值呢?
因为OxFF的16进制数为ffffffff (即8个f)。按与运算的法则,

先来看二进制的与运算,如:-1 & 1 = 1
-1(负1)的二进制编码为:   11111111     11111111    11111111   11111111   即一个32位的字符串,前面一位是1表示负数
1(正1) 的二进制编码为: 00000000    00000000   00000000  00000001   即,只有最后一位是1,其他部分全部为0
按&(与运算)的法则结果:  00000000    00000000   00000000   00000001  即,只有当两个都为1时才为1,所以最后的结果为:1(正1)

则可以知道为什么要与0xFF进行与运算,因为OxFF的16进行为 :000000FF。任意数与OxFF进行与运算都是取16进制的后两位
运算示例如下:
-127(负数127)的16进制为:   FFFFFF81
0xFF的16进制为:           000000FF
则&(与)运算是结果为:     00000081
所以:Integer.toHexStriing(-127 & 0xFF) 的结果为:81。

另外,其中很多计算,都使用0x这样的16进制进行运行:
如 0xF的二进制为 1111 ,即四个1。
   0xFF的二进制为 1111 1111 ,即8个1的二进制形式
   每多一个F就是多一个4位的1111。
   最多8个F。
分享到:
评论
1 楼 像胡杨树一样活着 2013-01-27  
欣赏有想法并努力实践的人。支持!

相关推荐

    C语言基本数据类型及运算题库

    ,因为oxff是一个非法的十六进制数,因为十六进制数不能以小写字母o开头。 13. 逻辑表达式 在C语言中,逻辑表达式是用于进行逻辑运算的表达式。例如,x && y 是一个逻辑表达式,用于判断变量x和y的值是否同时为真...

    C语言题库(1)(1).doc

    不合法的十六进制数是`oxff`,因为`o`不是有效的十六进制字符(A选项)。合法的选项包括`0Xcde`, `Oxll`, 和`Ox23`。 2. 排序算法比较次数:排序三个数至少需要进行3次比较(B选项)。例如,冒泡排序在最坏情况下...

    c语言最新多选题试卷.doc

    C语言中,十六进制数可以是以0x或0X开头,A:oxff、B:0Xabc、C:0x01、D:0X9X正确答案为BC。十六进制数可以是以0x或0X开头,后面跟着十六进制数字。 5. 变量的自增运算:题号346 在C语言中,变量的自增运算可以是...

    c语言习题好题完整版

    不合法的十六进制数为oxff,因为它的小写o不应该出现在十六进制数前。 - **自增和自减运算符**:在C语言中,自增(`++`)和自减(`--`)运算符用于将变量的值增加或减少1。对于前置形式,如`++k`,先增加后使用;对于...

    全国计算机等级考试二级教程C语言程序的设计说明.doc

    选项2.13中的A) oxff不是合法的十六进制数,因为在C语言中,十六进制数的前缀应该是`0x`而不是`ox`。 4. **标识符**: - 用户标识符应遵循一定的规则,例如不能以数字开头,不能与关键字重名等。例如,选项2.4中的...

    《全国计算机等级考试二级教程——C语言程序设计》课后题及参考答案定义.pdf

    十六进制数的前缀应该是`0x`,所以`oxff`是不合法的。 填空题部分涉及了表达式的求值、变量的赋值和函数定义的结构。例如,对整型变量k进行自增操作后,表达式的值是11,但变量k的值变成了12。对于double型变量x,...

    全国计算机等级考试二级教程之C语言程序设计课后题及参考答案.pdf

    十六进制数若以`ox`或`0X`开头,其后的字符必须是0-9或A-F,所以`oxff`不合法,因为它缺少前导的`0`或`0X`。 - 函数定义:函数体由`{`开始,用`}`结束,包括定义和执行两部分。 - 关键字与标识符:C语言的关键字如...

    C语言基本测试题目

    十六进制数以0x或0X开头,`oxff`, `0Xabc`, `0x11`都是合法的,但`0x19`在某些编译器中可能被视为非法,因为它在某些系统中表示的数值超过了一个字节的范围。 填空题的答案如下: [2.14] 运算 `k++` 后表达式的值...

    oxFF-开源

    oxFlexFramework是Java 100%开源项目。 它将帮助开发人员将Flex与J2EE容器一起使用。 这是一个简单易用的框架,将提供一套工具来管理数据访问,日志记录系统和错误处理等。

    江苏省计算机二级考试c语言试题

    - 十六进制数以`0x`或`0X`开头,`oxff`不是合法的十六进制数,应写为`0xFF`。 11. **函数和程序结构**: - C程序由一个或多个函数组成,但执行从`main`函数开始。 - 函数定义以`{`开始,以`}`结束,分为定义部分...

    java byte相互转换详解左右位移

    ` 这里`b & 0xFF`操作的目的是保证只有低8位参与运算,因为0xFF是一个字节的掩码,即***,与任何数按位与都会将该数的高24位置为0。 2. **int转byte**:将int转换为byte数组时,我们需要将int的每个字节分离到byte...

    PC机与单片机串口通信

    串口通信是计算机技术中的一种常见通信方式,尤其在PC机与单片机之间进行数据交换时尤为重要。本文将深入探讨这一主题,包括PC机与单片机串口通信的基本概念、实现方法以及使用VB(Visual Basic)中的MSComm控件进行...

    c语言谭汉强

    - `&&`:逻辑与运算符,当两边的表达式都为真时结果为真。 - `||`:逻辑或运算符,当两边的表达式至少有一个为真时结果为真。 - `!`:逻辑非运算符,取反。 **例题解析**: 6. 表达式 `(x &gt;= y && ch !y)` 的值取决...

    计算机教材全部习题答案.doc

    - 十六进制数的规则,`oxff`中的`o`应为`0`,因此是不合法的。 - 整型常量的正确形式是`-20`。 - 实型常量的正确形式是`.871`。 - 错误的实型常量是`0.8103e 3`,因为指数表示应无空格。 - 变量`zyx`的数学表示,`x ...

    计算机应用模拟试题(一)

    - **知识点**: 十六进制数的合法表示形式。 - **解析**: 不合法的表示是`A.oxff`。十六进制数前缀应该是大写字母“O”。 18. **C语言目标文件扩展名** - **知识点**: C语言编译后目标文件的扩展名。 - **解析...

    加密的通信安全

    给出的几种加密源码包,应用...对称加密AES或者DES,56位的DES加密,128位或192位或256位AES加解密通常可设随便的密码长度,其它位用常字符代替如oxff;非对称加密多要先因式分解,对称加密多就移位处理。其实能应用则可

Global site tag (gtag.js) - Google Analytics