【问题标题】:Iterating bits of a char迭代字符的位
【发布时间】:2010-03-19 20:23:54
【问题描述】:

假设我有字符“C”,其 ascii 代码为0110 0111。我怎样才能迭代它的位?我想从这些 1 和 0 构建一个向量......

【问题讨论】:

    标签: java bit-manipulation


    【解决方案1】:

    一个字符有一个整数值。这样的事情会起作用:

     int myChar = 42;
     String binstr = Integer.toBinaryString(myChar);
    

    剩下的部分我将留给你作为练习 - 但你现在要做的就是迭代你的二进制值的字符串表示,然后做你计划做的任何事情。

    【讨论】:

    • 按位运算更快,可能是更好的答案。上面的解决方案可能更容易阅读。
    【解决方案2】:

    您可以使用按位运算符轻松迭代它们:

    char c = 'C';
    for (int i = 0; i < 8; ++i)
    {
      // extract the i-th bit
      int b = ((c & 1<<i) >> i);
      // b will be 1 if i-th bit is set, 0 otherwise
    
      // do whatever you want with b
    }
    

    您可以对其进行优化(如 cmets 中的建议):

    int b = ((c >> i) & 1);
    

    【讨论】:

    • 天啊,伙计们,当这个问题看起来很像家庭作业时,不要给出代码......只是朝着正确的方向轻推!
    • 从 OP 的个人资料中可以看出,他不是学生。
    【解决方案3】:

    展开循环:

    int[] bits = new int[8]
    bits[0] = (c & 1) > 0 ? 1 : 0;
    bits[1] = (c & 2) > 0 ? 1 : 0;
    bits[2] = (c & 4) > 0 ? 1 : 0;
    bits[3] = (c & 8) > 0 ? 1 : 0;
    bits[4] = (c & 16) > 0 ? 1 : 0;
    bits[5] = (c & 32) > 0 ? 1 : 0;
    bits[6] = (c & 64) > 0 ? 1 : 0;
    bits[7] = (c & 128) > 0 ? 1 : 0;
    

    【讨论】:

      【解决方案4】:

      只需在您关心的每个位置使用按位检查即可。类似下面的内容将创建一个数组 bits 来保存各个值。

      char c = 'C';
      int[] bits = new int[8];
      
      int j = 0;
      for(int i = 1; i <= 256; i *= 2){
          bits[j++] = (c & i) > 0 ? 1 : 0;
      }
      

      【讨论】:

      • @Jeff,当然,但就目前而言,这是一个体面、正确且可读的答案。这样的吊坠不应该被否决。
      • 我没有投反对票。实际上,我投票并提交了您的展开版本。 Ppl 应该解释反对票。
      【解决方案5】:

      您必须使用按位运算来做到这一点:

      即:

      while (my_char > 0) {
        if my_char & 1 
          char_vector.push 1 // if the right most bit is 1
        else 
          char_vector.push 0 // right most bit must be 0 if we fell through to the else
        my_char = my_char >> 1 // right shift one position
      }
      

      如果需要,可以在右移到零后用剩余的 0 填充 char_vector。

      【讨论】:

      • 这在我看来不像 Java :-/
      • 原谅类似 c 的伪代码。 ;) 这没有意义,还是您只是提到我没有编写语法正确的代码? (当然,我不打算这样做)
      【解决方案6】:
      char c = 'C';
      Vector<Boolean> vector = new Vector<Boolean>(16);
      for (int i = Character.SIZE-1; i >=0; --i) {
          int num = c >> i;
          boolean set = (num & 1) == 1;
          vector.add(Boolean.valueOf(set));
      }
      

      【讨论】:

        猜你喜欢
        • 2012-10-26
        • 2015-03-31
        • 2014-04-21
        • 2012-10-23
        • 2011-06-03
        • 2020-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多