手台式机耳机耳麦不能一怎么在台式上当麦使用?

java(125)
java中byte转换int时为何与0xff进行与运算
在剖析该问题前请看如下代码
&public static String bytes2HexString(byte[] b) {
& String ret = &&;
& for (int i = 0; i & b. i++) {
&& String hex = Integer.toHexString(b[i] & 0xFF);
&& if (hex.length() == 1) {
&&& hex = '0' +
&& ret += hex.toUpperCase();
上面是将byte[]转化十六进制的字符串,注意这里b[i] & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出
b[i] & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[i]);,将byte强转为int不行吗?答案是不行的.
其原因在于:
1.byte的大小为8bits而int的大小为32bits
2.java的二进制采用的是补码形式
在这里先温习下计算机基础理论
byte是一个字节保存的,有8个位,即8个0、1。
8位的第一个位是符号位,&
也就是说代表的是数字1&
代表的就是-1&
所以正数最大位,也就是数字127&
负数最大为,也就是数字-128
上面说的是二进制原码,但是在java中采用的是补码的形式,下面介绍下什么是补码
&&&&&&& 一个数如果是正,则它的反码与原码相同;
&&&&&&& 一个数如果是负,则符号位为1,其余各位是对原码取反;
2、补码:利用溢出,我们可以将减法变成加法
&&&&&& 对于十进制数,从9得到5可用减法:
&&&&&& 9-4=5&&& 因为4+6=10,我们可以将6作为4的补数
&&&&&& 改写为加法:
&&&&&& 9+6=15(去掉高位1,也就是减10)得到5.
&&&&&& 对于十六进制数,从c到5可用减法:
&&&&&& c-7=5&&& 因为7+9=16 将9作为7的补数
&&&&&& 改写为加法:
&&&&&& c+9=15(去掉高位1,也就是减16)得到5.
&&& 在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(),进位1被丢弃。
&&& ⑴一个数为正,则它的原码、反码、补码相同
&&& ⑵一个数为负,刚符号位为1,其余各位是对原码取反,然后整个数加1
&- 1的原码为&&&&&&&&&&&&&&&
&- 1的反码为&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& + 1
&- 1的补码为&&&&&&&&&&&&&&&
&0的原码为&&&&&&&&&&&&&&&&
&0的反码为&&&&&&&&&&&&&&&& (正零和负零的反码相同)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& +1
&0的补码为&&&&&&&&&&&&&& (舍掉打头的1,正零和负零的补码相同)
Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位,
例如补码的十进制数为-1转换为int时变为好多1啊,呵呵!即0xffffffff但是这个数是不对的,这种补位就会造成误差。
和0xff相与后,高24比特就会被清0了,结果就对了。
本文来自CSDN博客,转载请标明出处:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:145729次
积分:2058
积分:2058
排名:第17905名
原创:37篇
转载:152篇
(5)(1)(10)(7)(2)(6)(1)(2)(1)(4)(32)(21)(25)(1)(3)(10)(5)(15)(4)(3)(2)(8)(11)(5)(1)(4)java中byte转换int时为何与0xff进行与运算_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
java中byte转换int时为何与0xff进行与运算
上传于|0|0|暂无简介
你可能喜欢java int,byte型数据在内存中的形式
java int,byte型数据在内存中的形式
编辑:www.fx114.net
本篇文章主要介绍了"java int,byte型数据在内存中的形式",主要涉及到java int,byte型数据在内存中的形式方面的内容,对于java int,byte型数据在内存中的形式感兴趣的同学可以参考一下。
&import static java.lang.System.
import java.io.F
import java.io.FileInputS
import java.io.IOE
public class NativeMethod {
public native int T(String str);
public String toBinaryString(int i) {
return toUnsignedString(i, 1);
public String toOctalString(int i) {
return toUnsignedString(i, 3);
public String toHexString(int i) {
return toUnsignedString(i, 4);
private String toUnsignedString(int i, int shift) {
char[] str = new char[32];
int charPos = 32;
int mask = 1 &&
str[--charPos] = digits[i & mask];
} while (i != 0);
return new String(str, charPos, 32 - charPos);
public static String toBinaryString(byte b) {
char[] str = new char[32];
int charPos = 32;
int mask = 1 && 4;
* Very Important:
*1)位运算符只针对4byte的int型
*2)-2的byte类型 16进制表示为FE(2取反加1)
*3)-2 & 0xFF运算: 实际-2带符号位bit-wise成
int,即FE会变成FFFFFFFE(2取反加1),
* 接着 0xFFFFFFFE & 0x000000FF = 0x 000000FE;
* 如果不&,就是FFFFFFFE。
int i = b & 0
str[--charPos] = digits[i & mask];
} while (i != 0);
return new String(str, charPos, 32 - charPos);
final static char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
版权声明:本文为博主原创文章,未经博主允许不得转载。
本站评论功能暂时取消,后续此功能例行通知。
本文标题:
本页链接:2977人阅读
Java(126)
1、与运算符的理解(&):&
&&&&& 参加运算的两个数据,按二进位进行“与”运算。如果两个相应的二进位都为1,则该位的结果值为1,否则为0。即 0&0=0;0&1=0;1&0=0;1&1=1;
例子:int x = ; y =0
转二进制:x =
y& =&0xFF = ;
-----------------------------------------------
&&&&&(从右到左做与运算,不足的补0)
&&&&& 如果参加&运算的是负数(如-3 & -5),则以补码形式表示为二进制数,然后按位进行“与”运算。
&&&&& 注:计算机中的负数是以其补码形式存在的 补码=原码取反+1,一个字节有8位 可以表示的数值范围在 -128到+127 用二进制表示也就是
- (注意:最高位表示符号)最高位是1的都是负数 最高位是0的都是正数,如-7 原码是
然后取反(最高位是符合不用取反)得
得 那么-7的二进制数就是 ;再如 -10 原码是
加一得 ,那么-10的二进制数就是 。
<span style="color:#、移位运算:java移位运算符三种:&&(左移)、&&(带符号右移)和&&&(无符号右移):
<span style="font-family:A font-size:12 color:#.1、 左移运算符
&&&&&& 左移运算符&&使指定&#20540;的所有位都左移规定的次数。
<span style="font-family:A font-size:12 color:#)它的通用&#26684;式如下所示:
value && num
num 指定要移位&#20540;value 移动的位数。
左移的规则只记住一点:丢弃最高位,0补最低位
如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33%32=1位。
<span style="font-family:A font-size:12 color:#)运算规则
按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
当左移的运算数是int 类型时,每移动1位它的第31位就要被移出并且丢弃;
当左移的运算数是long 类型时,每移动1位它的第63位就要被移出并且丢弃。
当左移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。
<span style="font-family:A font-size:12 color:#)数学意义
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方
<span style="font-family:A font-size:12 color:#)计算过程:
例如:3 &&2(3为int型)
<span style="font-family:A font-size:12 color:#)把3转换为二进制数字00 00 ,
<span style="font-family:A font-size:12 color:#)把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,
<span style="font-family:A font-size:12 color:#)在低位(右侧)的两个空位补零。则得到的最终结果是00 00 ,
转换为十进制是12。
2.2、 右移运算符
右移运算符&&使指定&#20540;的所有位都右移规定的次数。
<span style="font-family:A font-size:12 color:#)它的通用&#26684;式如下所示:
value && num
num 指定要移位&#20540;value 移动的位数。
右移的规则只记住一点:符号位不变,左边补上符号位
<span style="font-family:A font-size:12 color:#)运算规则:
按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1
当右移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。
例如,如果要移走的&#20540;为负数,每一次右移都在左边补1,如果要移走的&#20540;为正数,每一次右移都在左边补0,这叫做符号位扩展(保留符号位)(sign extension ),在进行右移
操作时用来保持负数的符号。
<span style="font-family:A font-size:12 color:#)数学意义
右移一位相当于除2,右移n位相当于除以2的n次方。
<span style="font-family:A font-size:12 color:#)计算过程
<span style="font-family:A font-size:12 color:# &&2(11为int型)
<span style="font-family:A font-size:12 color:#)11的二进制形式为:00 00
<span style="font-family:A font-size:12 color:#)把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。
<span style="font-family:A font-size:12 color:#)最终结果是00 00 。
转换为十进制是2。
<span style="font-family:A font-size:12 color:# && 2(35为int型)
<span style="font-family:A font-size:12 color:#转换为二进制:00 00
把低位的最后两个数字移出:00 00
转换为十进制: 8
<span style="font-family:A font-size:12 color:#)在右移时不保留符号的出来
&&&& 右移后的&#20540;与0x0f进行按位与运算,这样可以舍弃任何的符号位扩展,以便得到的&#20540;可以作为定义数组的下标,从而得到对应数组元素代表的十六进制字符。
2.3、无符号右移
无符号右移运算符&&&
它的通用&#26684;式如下所示:
value &&& num
num 指定要移位&#20540;value 移动的位数。
无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位
无符号右移运算符&&& 只是对32位和64位的&#20540;有意义
<span style="color:#、java中:
<span style="font-size:12 color:#
一个byte&占一个字节,即8位比特;
<span style="font-size:12 color:#
一个int&占4个字节,即32比特;
<span style="font-size:12 color:#
java的二进制采用的是补码形式:
&⑴一个数为正,则它的原码、反码、补码相同
&⑵一个数为负,则符号位为1,其余各位是对原码取反,然后整个数加1
因为补码存在,所以右移运算后要与0xff相与运算
<span style="font-size:12 color:#
在Java中,当我们要将int&转换为byte数组时,一个int就需要长度为4个字节的数组来存放,其中一次从数组下标为[0]开始存放int的高位到低位。
Java中的一个byte,其范围是-128~127的,而Integer.toHexString的参数本来是int,如果不进行&0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,举例来说,一个byte的-1(即0xff),会被转换成int的-1(即0xffffffff),那么转化出的结果就不是我们想要的了。
而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。
<span style="color:#、代码:
* int到byte[]
* @param i
public static byte[] intToByteArray(int i) {
byte[] result = new byte[4];
//由高位到低位
result[0] = (byte)((i && 24) & 0xFF);
result[1] = (byte)((i && 16) & 0xFF);
result[2] = (byte)((i && 8) & 0xFF);
result[3] = (byte)(i & 0xFF);
* byte[]转int
* @param bytes
public static int byteArrayToInt(byte[] bytes) {
int value=0;
//由高位到低位
for(inti = 0; i & 4; i++) {
int shift= (4-1-i) * 8;
value +=(bytes[i] & 0x000000FF) &&//往高位游
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:734968次
积分:9787
积分:9787
排名:第1718名
原创:142篇
转载:764篇
译文:31篇
评论:97条
(8)(22)(28)(25)(48)(39)(53)(3)(96)(74)(39)(64)(71)(57)(154)(132)(14)(2)(3)(3)(16)(2)(2)(1)}

我要回帖

更多关于 台式机耳机耳麦不能一 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信