• 无双
    2018-12-10
    请问有没有方法,快速实现进制转换,比如二进制、十进制、八进制、十六进制互相转化,我考试有要求要转,就是笔算,谢谢。

    作者回复: 如果要快速在二进制、八进制和十六进制间转换,方法确实存在,可以上网查一些资料。如果很多人都感兴趣,我可以加入

    
     77
  • huang
    2019-01-15
    算术左移和逻辑左移一样,是因为对于有符号数来说,如果数据最高位(第二个bit)和符号位(第一个bit)不同,则左移之后必然溢出。
    举个例子,8个bit表示-128-127,如果数据最高位和符号位不同,则这个数的绝对值肯定大于64,左移一位肯定溢出。
    所以“有效”的左移不用担心数据最高位会改变符号位,也就不用区分逻辑左移和算术左移。

    作者回复: 很好的回答

     4
     44
  • maliming
    2019-01-12
    /**
         * @Title: decimalToBinary
         * @Description: 十进制转二进制,方法1:余数短除法除以二
         * @param decimalSource
         * @return: String
         */
        /*public static String decimalToBinary(int decimalSource) {
            StringBuilder sb = new StringBuilder();
            while (decimalSource != 0) {
                sb.append(decimalSource % 2);
                decimalSource = decimalSource >> 1;
            }
            return sb.reverse().toString();
        }*/

        /**
         * @Title: decimalToBinary
         * @Description: 十进制转二进制,方法2:降二次幂及减法混合运算
         * @param decimalSource
         * @return: String
         */
        /*public static String decimalToBinary(int decimalSource) {
            int length = (int) (Math.log(decimalSource) / Math.log(2));
            StringBuffer sb = new StringBuffer();
            do {
                decimalSource = (int) (decimalSource - Math.pow(2, length));
                int power = decimalSource <= 0 ? -1 : (int) (Math.log(decimalSource) / Math.log(2));
                for (int i = length; i > power; i--) {
                    if (i == length) {
                        sb.append("1");
                    } else {
                        sb.append("0");
                    }
                }
                length = power;
            } while (decimalSource > 0);
            return sb.toString();
        }*/
        /**
         *
         * @Title: decimalToBinary
         * @Description: 十进制转二进制,方法3:位运算法
         * @param decimalSource
         * @return
         * @return: String
         */
        public static String decimalToBinary(int decimalSource) {
            StringBuffer sb = new StringBuffer();
            while (decimalSource != 0) {
                //此&运算,decimalSource & 1,目的是获取最低位的二进制数值
                sb.append(decimalSource & 1);
                //此>>运算,decimalSource >> 1,目的是将获取到的最低位二进制数值除去
                decimalSource = decimalSource >> 1;
            }
            return sb.reverse().toString();
        }
    负整数转换为二进制 要点:
    取反加一 解释:将该负整数对应的正整数先转换成二进制,然后对其“取补”,再对取补后的结果加1即可。
    例如要把-52换算成二进制:
    1.先取得52的二进制:00110100
    2.对所得到的二进制数取反:11001011
    3.将取反后的数值加一即可:11001100 即:(-52)10=(11001100)2
    展开

    作者回复: 很好的总结

     1
     30
  • 溯雪
    2018-12-10
    老师,为什么不需要区分逻辑左移和算术左移呢?
    比如十进制数-3,对应二进制1000...0011,那按照右移的思路,应该有两种移法,一种是符号位不动其它位置左移的1000...0110,一种是全部左移导致符号位被顶出去的0000....0110嘛

    作者回复: 右移存在一个问题是,在高位补0还是1。但是左移只需要考虑后面补0就可以了

     3
     30
  • 南山
    2018-12-10
    逻辑或,与,异或一般有什么使用场景,平常写代码不怎么用

    作者回复: 在elasticsearch的filter查询中,用到的bitset就是位运算,比查询倒排索引效率更高

    
     27
  • somenzz
    2018-12-10
    #python实现

    #encoding=utf-8
    def int3binary(num):
    result=[]
    while num!=0:
    result.append(num & 1)
    num = num >> 1
    result.reverse()
    return result

    print(*int2binary(10))

    #输出 1010
    展开
    
     25
  • 指间砂的宿命
    2018-12-10
    数字与1做与操作,结果为1说明低位是1,否则为0,然后数字右移,重复以上操作,直到数字为0结束,倒序输出所有结果
     1
     19
  • Lugyedo
    2018-12-10
    为什么不区分逻辑左移和算术左移
    
     17
  • Libra
    2018-12-10
    import java.util.Scanner;

    public class Test1 {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);

            int value = scanner.nextInt();
            boolean flag = false;

            for (int i = 31; i >= 0; i--) {
                int temp = value & (1 << i);
                if (temp > 0){
                    flag = true;
                }
                if (flag){
                    if (temp > 0){
                        System.out.print(1);
                    }else {
                        System.out.print(0);
                    }
                }
            }
        }
    }
    展开

    作者回复: 还可以考虑负数的情况

    
     16
  • sloth-yp
    2018-12-18
    最后的思考题, 是不是应该考虑负数,用补码表示?

        public static String decimal2Binary(int decimal) {
            // 负数的话,先换成正数然后取反再加1,再递归调用本函数
            if (decimal < 0) {
                int reverseNumber = ((decimal * -1) ^ Integer.MAX_VALUE) + 1;
                return decimal2Binary (reverseNumber);
            }
            StringBuilder sb = new StringBuilder();
            while (decimal > 0) {
                // 跟0x0001 按位与,求得最低位的值
                String lastNumber = String.valueOf(decimal & 1);
                // 插入到字符串的最前面(这样才是原始的顺序)
                sb.insert(0, lastNumber);
                // 算术右移
                decimal = decimal >> 1;
            }
            return sb.toString();
        }
    展开

    作者回复: 是的 需要考虑补码

    
     14
  • Li Shunduo
    2018-12-10
    请问文章里的图是用什么软件画的?
    
     12
  • panda
    2018-12-11
    异或 我想到一个算法题 判断很多数是不是有相等的

    作者回复: 是的 很经典的一道面试题

    
     11
  • somenzz
    2018-12-10
    2^3<10<2^4

    得到3,然后

    10>>3=1
    (10>>2)&1=0
    (10>>1)&1=1
    10&1=0

    得到1010
    展开

    作者回复: 👍 再考虑一下负数的情况

    
     10
  • 桃园悠然在
    2018-12-11
    被池大吓得赶紧买一个数学专栏,配合吴军老师的数学之美一起看。
    
     9
  • 石佳佳_Gemtra
    2018-12-10
    1.不考虑溢出的话,二进制数左移 n 位,即乘以 2^n;同理,右移 n 位,即除以 2^n,且向下取整数,因为移除的 n 位不全为 0 的话,除的结果就会包含小数。
    2.不考虑溢出的话,有符号和无符号的左移运算结果相同,而右移的结果不同,所以会有逻辑右移和算术右移的区别。
    3.两个数按位「异或」结果为 0,是这两个数值相等的必要充分条件。
    4.思考题
    Java 不太了解,根据提示,判断 n 位是否为 1,可与 1 左移n位后的数进行「与」运算,为真则为 1,反之为 0,循环即可。
    
     9
  • daydreamer
    2018-12-18
    我查了一下Python里面没有“逻辑右移”运算符吧,除非自己手动实现

    作者回复: 我又查了一下,确实需要自己实现

    
     8
  • Transient
    2018-12-10
    加密算法中也有许多用到二进制运算吧,而且二进制应该还有取反操作吧

    作者回复: 是的 还有取反操作

    
     7
  • 刘凯
    2019-01-04
    思考题
    - (void)decimal2Binary:(NSInteger)value{
        NSString *result = @"";
        if (value < 0) {
            value = ((value * -1)^(INTMAX_MAX)) + 1;
        }
        for (NSInteger i = 31 ;i >= 0; i--) {
            if (value & (1 << i)) {
                result = [result stringByAppendingString:@"1"];
            }else{
                result = [result stringByAppendingString:@"0"];
            }
        }
        NSLog(@"%@", result);

    }
    展开

    作者回复: 负数的处理很赞

     1
     6
  • Julian
    2018-12-12
    01 | 二进制:不了解计算机的源头,你学什么编程的学习总结;
    一:对于进制我现在的理解就是几进制就是以几为基数,然后按照左高右低规则进行基数幂运算然后在乘以数量然后在相加。例如:二进制110,首先基数是“2”;坐高右低原则就是“2 1 0”分别对应最左边的“1 1 0”;其实坐高右低就是从右边以0开始然后依次加一,这个是进行幂运算的多少次方的数字。所以这个二进制数转换成我们日常的十进制的计算规则就是:1*2^2 + 1*2^1 + 0*2^0;最终结果就是 4 + 2 + 1 = 7;

    二:二进制的位操作;
        1.二进制的移位操作;分为左移(<<)和右移;其中右移又分为算数右移(>>)和逻辑右移(>>>);
              二进制左移<<:110 其实就是一次把数字往左移动一位,最右边补0所以最终就是1100;左移规律是数字的值翻倍;
              二进制右移>>:同上就是把数字往右边移动一位,然后最左边数字看情况;如果是算术右移就要考虑正负数的问题;正负数在计算机里面java实现是看你操作系统位数,最后一位代表正负数的标识;0:代表正数;1:代表负数;所以算术右移我理解就是考虑计算,既然考虑计算也就是考虑正负数的问题;对于负数的算术右移左边是要上1的,对于正数的算数右移左边是上0的;但是对于逻辑右移,不管你是正数还是负数,左边都是上0的;

        2.二进制的逻辑操作;
         逻辑或 | : 就是2个二进制数,从右到左,对相同位置的数字进行或运算;或运算就是 全是0才表示0,其余全是1;或顾名思义,只要有真就代表真;
         逻辑与 & : 就是2个二进制数,从右到左,对相同位置的数字进行与运算;与运算就是参与运算数字全1才是1,其余的都是0;与顾明思议,相同的而且都是真才为真;
         逻辑异或 ^: 就是2个二进制数吗,从右到左,对相同位置的数字进行运算;异或运算就是参与运算的数字相同结果为0,其余全为1;异或顾明思议,不同的才为真;

    在计算机世界,1代表真,0代表假;
    展开
    
     5
  • 郑晨Cc
    2018-12-10
    思考题
    public class test {

        public static void main(String[] args){
             StringBuffer sb = null;
            int a = 53;
            
            String buffer = null;
            
            while(a>1){
                System.out.println("余数:" + a % 2);
                String b = String.valueOf(a % 2);
                if(null == sb){
                    sb = new StringBuffer(b);
                }else{
                    sb.insert(0, b);
                }    
                a = a >>>1;
                System.out.println("商:"+a);    
                
            }
            
            sb.insert(0, a);
            System.out.println(sb);
        }
        
    }
    展开

    作者回复: 还需要考虑负数的情况

    
     5
我们在线,来聊聊吧