Java 取反运算符

java中取反 是会看第一位是符号位 如果是1就会转为负数 我不想要这样的结果 就是把它当成无符号 我的数据类型是lang=64509 Java中取反-64510
我想要的结果是1026
没分了 以后肯定补上

用以下代码可以实现你要求的功能:
long lang=64509;
String str1=Long.toBinaryString(lang);//将给定的数转为二进制字串
String str2=Long.toBinaryString(~lang);//将给定的数取反转为二进制字串
//将取反后的二进制串取最后的 长度与第一个串长度相等 的子串,这是我们需要的二进制串
String str=str2.substring(str2.length()-str1.length());
//将它转换为十进制整数
int i=Integer.parseInt(str, 2);
System.out.println(i);

具体理论知识如下所示:
先要理解一些概念:
在2进制中,负数是以它正值的补码形式表达
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。

比如 0000 0000 0000 0000 0000 0000 0000 0101是 5的 原码。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。

取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)

比如:将5的二进制表达式的每一位取反,得
1111 1111 1111 1111 1111 1111 1111 1010
称:1111 1111 1111 1111 1111 1111 1111 1010 是 0000 0000 0000 0000 0000 0000 0000 0101 的反码。

反码是相互的,所以也可称:

1111 1111 1111 1111 1111 1111 1111 1010 和 0000 0000 0000 0000 0000 0000 0000 0101 互为反码。

补码:反码加1称为补码。
也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
那么,5的补码为:

1111 1111 1111 1111 1111 1111 1111 1010 + 1 =
1111 1111 1111 1111 1111 1111 1111 1011

所以,-5 在计算机中的二进制表达为:
1111 1111 1111 1111 1111 1111 1111 1011
转换为十六进制:0xFFFFFFFB。

====================================

明白了上面的就可以理解怎么求 ~i 了
int型储存32个二进制位,~这个符号是按位取反,就是求i的反码。
即得到1111 1111 1111 1111 1111 1111 1111 1010
上面这串二进制代表一个负数,将它转换成int型过程如下:

1111 1111 1111 1111 1111 1111 1111 1010-1 =
1111 1111 1111 1111 1111 1111 1111 1001

再求反:

0000 0000 0000 0000 0000 0000 0000 0110

这个值就是5的按位取反所得到的int整数的绝对值(注意:5按位取反得到的是负数)

所以转换为int型为:6
即:int型的i=5 取反后的结果为-6

参考资料:http://zhidao.baidu.com/question/28097219.html

温馨提示:内容为网友见解,仅供参考
第1个回答  2018-04-26
/**
 * 计算反码
 * @param trueCode  原码
 * @return
 */
public static long getOnesComplementCode(long trueCode){
    long result = 0 ;
    StringBuilder sb = new StringBuilder();
    String trueBinaryStr = Long.toBinaryString(trueCode);
    if(!TextUtils.isEmpty(trueBinaryStr)){
        String[] list = trueBinaryStr.split("");
        for (int i = 0; i < list.length; i++) {
            String item = list[i];
            if(item.equals("0")){
                sb.append("1");
            }else if(item.equals("1")){
                sb.append("0");
            }
        }
        String resultStr = sb.toString();
        if(!TextUtils.isEmpty(resultStr)){
            result = Long.valueOf(resultStr,2);
        }
    }
    return result;
}

System.out.println("取反:" + WifiUtil.getOnesComplementCode(64509));

输出:取反:1026

第2个回答  2010-07-08
你要的效果是不是直接用65535来减?是的话直接减。。。

取反是什么意思?
取反,是Java使用补码来表示二进制数,在补码表示中,最高位为符号位,正数的符号位为0,负数为1。NOT,是汇编指令里逻辑运算符号:NOT表示取反的意思。补码的规定如下:对正数来说,最高位为0,其余各位代表数值本身(以二进制表示),如+42的补码为00101010。对负数而言,把该数绝对值的补码按位取...

Java 取反运算符
long lang=64509;String str1=Long.toBinaryString(lang);\/\/将给定的数转为二进制字串 String str2=Long.toBinaryString(~lang);\/\/将给定的数取反转为二进制字串 \/\/将取反后的二进制串取最后的 长度与第一个串长度相等 的子串,这是我们需要的二进制串 String str=str2.substring(str2.l...

取反运算是什么意思
取反,是Java使用补码来表示二进制数,在补码表示中,最高位为符号位,正数的符号位为0,负数为1。1、正数取反,先将初始数值转换成二进制数,再对二进制数的每一位进行运算:将0变为1、将1变为0。得到的是最终结果的补码,要转换为最终结果的原码则需再次取补码,就能得到计算结果。2、负数取反...

java取反运算符
我是这么理解的,如果按你说的,根据这种情况书上说两个衣服串相等时是false不等时是true说明!是先起作用的,也就是说先取反后进行比较,因为equals是判断前后是否相等,所以如果两个字符串相同,前面取反就是false

java中的“~”这个符号是表示什么意思啊?
按位取反是针对二进制的,比如2的二进制表示为010,那么~2就是101 每位可以代表一个含义,针对你的问题。我们可以定义SelectionKey.OP_READ为100,表示读权限 我们可以定义SelectionKey.OP_WRITE为010,表示写权限 我们可以定义SelectionKey.OP_EXECUTE为001,表示可执行权限 则111就表示拥有所有的读、写、...

java中源码反码补码与取反的理解
在Java中,~符号执行按位取反运算。例如,~5的值为-6,-5的值为4。运算逻辑为,先将数值转换为二进制,对每一位取反,得到的是补码,需要再次取补码才能得到原码。按位取反与反码不同。反码法中,正数原反补码相同,负数反码为原码除符号位外取反。而按位取反运算中,正数取反先转二进制,取...

java语言里面的运算符~是什么意思
这个是位运算符中的一种,意思是按位取反 举个例子就明白了 int a = 4;~a的结果就是-5 过程如下:4的二进制表示为00000000 00000000 00000000 00000100 每一位取反后结果为 11111111 11111111 11111111 11111011 取反后第一位是1,为符号位,所以是负数,上面这个两进制表示的就是-5 希望能帮到...

java中按位取反运算的详解
按位取反就是每一位都取反,所谓取反就是1变0,0变1 比如楼主说的10 二进制表示就是00000000 00000000 00000000 00001010 取反后就是11111111 11111111 11111111 11110101 这在十进制中就是-11 而他的二进制原码表示就是-1011

java 中的 ~ 取补码的详细意思是什么 ?
~就是取反的意思。就是把那个数字的二进制位,原来是0的变为1,原来是1的变为0.而二进制补码表示的数字(现在的计算机几乎都是用的二进制补码来表示的)进行这样的操作就等于取相反数再减一。所以~5就是-5-1=-6.而后面那个~a-b就是~5-3,而~5=-6所以就是-6-3=-9了。对于二进制补码...

java^和!区别
^是XOR运算,异或运算。如:a = 0011 1100 b = 0000 1101 a^b = 0011 0001 !是取反操作,如!true=false, !1=0

相似回答