diff --git a/source/simple/geom/vector.hpp b/source/simple/geom/vector.hpp
index de217ed528933e8ede2c31124bcea29501cd1340..ca6cc44b4f0afac622f25d5986e7e648c30479df 100644
--- a/source/simple/geom/vector.hpp
+++ b/source/simple/geom/vector.hpp
@@ -393,6 +393,16 @@ namespace simple::geom
 				one[i] = !one[i];
 			return one;
 		}
+		template <typename C = typename meta::coordinate_type,
+			std::enable_if_t<std::is_same_v<C,bool>>* = nullptr>
+		[[nodiscard]]
+		friend
+		constexpr vector operator !(vector one) noexcept
+		{
+			for(size_t i = 0; i < Dimensions; ++i)
+				one[i] = !one[i];
+			return one;
+		}
 
 		template <size_t dimension>
 		[[nodiscard]]
diff --git a/unit_tests/point.cpp b/unit_tests/point.cpp
index 984659ba801d172d4fcca19de111bae76b8ff02c..165b3c1689bdc9e027ca6f52de38ca94b7de0cd2 100644
--- a/unit_tests/point.cpp
+++ b/unit_tests/point.cpp
@@ -398,6 +398,11 @@ void DiscreteArithmetic()
 	assert( ~vector(true, false, true, false) == vector(false, true, false, true) );
 	assert( ~vector(true, true, false, false) == vector(false, false, true, true) );
 	assert( ~vector(true, true, true, true) == vector(false, false, false, false) );
+
+	// ! for vector<bool>
+	assert( (!vector(true, false, true, false)) == vector(false, true, false, true) );
+	assert( (!vector(true, true, false, false)) == vector(false, false, true, true) );
+	assert( (!vector(true, true, true, true)) == vector(false, false, false, false) );
 }
 
 void ComparisonOperators()