2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

二重ビット否定(~~)を使ったコード Javascript

Last updated at Posted at 2020-03-23

はじめに

配列の要素ごとの要素数のカウントを調べている時にチルダ演算子の「なるほど」と思った使い方をご紹介します。

#チルダ演算子(~)とは

NOT 演算は、各ビットで実行します。NOT a は、a を反転した値 (1 の補数として知られています) を出力します。
引用

~9の場合
10進数9を2進数(1001)に変換。正確には32ビットになったものとして扱います。
つまり、00000000000000000000000000001001となります。
これを反転した値11111111111111111111111111110110=-10(10進数)が~9です。
文字列の場合NaNになり-1になるみたいです。

let num = 9;
console.log(~num);
// -10

let str = "a";
console.log(~str);
// -1

~-10になる性質を生かして、indexOfで検索したい際に値が存在しない場合を以下のように書けます。

let arr = ['a', 'b', 'c'];
let str = 'd';
if (!~arr.indexOf(str)) {
    console.log('なし')
}

###二重でチルダ(~~)を使用した時
32ビットの整数になるため、小数点は切り捨てられます。

console.log(~~1.0)
// 1
console.log(~~2)
// 2
console.log(~~2.3)
// 2
console.log(~~1.045)
// 1

// 文字の場合
console.log(~~"a")
// 0
console.log(~~"bb")
// 0
console.log(~~"ccc")
// 0
console.log(~~NaN)
// 0

#チルダ(~)を要素ごとのカウント

    let arr = [1, 2, 3, 4, 1, 1, 2];
    let map = {};
    arr.filter((num) => (map[num] = ~~map[num] + 1));
    console.log(map);
    // { '1': 3, '2': 2, '3': 1, '4': 1 }

上記の性質を使い、各配列の要素をkeyとし、valueにその配列内での要素ごとの個数をカウントする事できます。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?