как проверить байт внутри потока байтов, используя битовую маску - PullRequest
1 голос
/ 18 апреля 2020

У меня bytebuffer, и я читаю 8 байтов (длинных) за итерацию. У меня есть битовая маска, которую я хотел бы сравнить, но я не уверен, как должен выглядеть мой шаблон. Например,

private final static long ASCII_125 = 0x7D;

public static boolean isValidPath(
        DirectBuffer path)
{
  boolean isPathValid = true;
  for (int i = 0; i < path.capacity(); i += Long.BYTES)
  {
      long charsLong = path.getLong(i);
      if ((charsLong & result) != xxxxxx(pattern))
      {
          isPathValid = false;
          break;
      }
  }
  return isPathValid;
}

Итак, если charlong равен 0b01111011_01111011_00100101_00100101_01111011_01111011_01111101_01111101, и проверить, существует ли 01111101 байт в этих 8 байтах. Я думаю, мне нужно найти шаблоны, которые позволят мне логически проверять несколько значений одновременно, создать маску для этого шаблона, а затем применить маску ко всем 8 байтам одновременно. Но у меня возникли проблемы при разработке шаблона.

1 Ответ

1 голос
/ 18 апреля 2020

Как примерно так:

Это в основном проверяет каждый байт, сдвигая длинные правые 8 бит и маскируя его в байт.

  for (int i = 0; i < path.capacity(); i += Long.BYTES) { 
      long charsLong = path.getLong(i);
      while(charsLong > 0) {
          // get low order byte
          byte val = (byte)(charLong&0xFF);
          if ((val & result) != xxxxxx(pattern)) {
             return false;
          }
          // right shift thru sign bit by 8 bits 
          charsLong>>>= 8; 
      }
   }
   return true;

Обратите внимание, что если вы проверяете для заданного c значения байта вы можете просто сравнить каждый байт с результирующим байтом. Но если вы хотите проверить, установлены ли определенные биты в байтах, вам нужна битовая маска.

Например, чтобы увидеть, установлены ли младшие 101 бит, вы должны сделать следующее.

byte bitMask = 0b101;

if ((test & bitMask) == bitMask) {
   bits are set.
}

...