[dawn] Implement `HasOneBit()` with C++20 `std::has_single_bit()`

Bug: 343500108
Change-Id: Iaf360ab6f185fa2f95af7c8a62de6efd6b244e77
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/239485
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Loko Kung <lokokung@google.com>
Commit-Queue: Jiawei Shao <jiawei.shao@intel.com>
diff --git a/src/dawn/native/EnumClassBitmasks.h b/src/dawn/native/EnumClassBitmasks.h
index 770cd8f..e981957 100644
--- a/src/dawn/native/EnumClassBitmasks.h
+++ b/src/dawn/native/EnumClassBitmasks.h
@@ -28,6 +28,8 @@
 #ifndef SRC_DAWN_NATIVE_ENUMCLASSBITMASKS_H_
 #define SRC_DAWN_NATIVE_ENUMCLASSBITMASKS_H_
 
+#include <bit>
+
 #include "webgpu/webgpu_enum_class_bitmasks.h"
 
 namespace dawn::native {
@@ -44,7 +46,8 @@
 
 template <typename T>
 constexpr bool HasOneBit(T value) {
-    return HasZeroOrOneBits(value) && value != T(0);
+    using Integral = typename std::underlying_type<T>::type;
+    return std::has_single_bit(static_cast<Integral>(value));
 }
 
 }  // namespace dawn::native