Index: test/utilities/function.objects/bitwise.operations/bit_not.pass.cpp
===================================================================
--- test/utilities/function.objects/bitwise.operations/bit_not.pass.cpp	(revision 0)
+++ test/utilities/function.objects/bitwise.operations/bit_not.pass.cpp	(revision 0)
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <functional>
+
+// bit_not
+
+#include <functional>
+#include <type_traits>
+#include <cassert>
+
+int main()
+{
+    typedef std::bit_not<int> F;
+    const F f = F();
+    static_assert((std::is_base_of<std::unary_function<int, int>, F>::value), "");
+    assert(f(0xEA95) == ~0xEA95);
+    assert(f(0) == ~0);
+    assert(f(-1) == ~-1);
+}
Index: include/functional
===================================================================
--- include/functional	(revision 187276)
+++ include/functional	(working copy)
@@ -158,6 +158,30 @@
     bool operator()(const T& x) const;
 };
 
+template <class T>
+struct bit_and : binary_function<T, T, T>
+{
+    T operator()(const T& x, const T& y) const;
+};
+
+template <class T>
+struct bit_or : binary_function<T, T, T>
+{
+    T operator()(const T& x, const T& y) const;
+};
+
+template <class T>
+struct bit_xor : binary_function<T, T, T>
+{
+    T operator()(const T& x, const T& y) const;
+};
+
+template <class T>
+struct bit_not : unary_function<T, T>
+{
+    T operator()(const T& x) const;
+};
+
 template <class Predicate>
 class unary_negate
     : public unary_function<typename Predicate::argument_type, bool>
@@ -594,6 +618,13 @@
         {return __x ^ __y;}
 };
 
+template <class _Tp>
+struct _LIBCPP_TYPE_VIS bit_not : unary_function<_Tp, _Tp>
+{
+    _LIBCPP_INLINE_VISIBILITY _Tp operator()(const _Tp& __x) const
+        {return ~__x;}
+};
+
 template <class _Predicate>
 class _LIBCPP_TYPE_VIS unary_negate
     : public unary_function<typename _Predicate::argument_type, bool>
